Как то так:
<?php
$sql = "SELECT distinct `categories` FROM `products`";
$result = $link->query($sql);
?>
<?php while ($productcat = $result->fetch_assoc()) : ?>
<h1><?= $productcat['categories'] ?></h1>
</div>
</div>
<?php
$sql = "SELECT * FROM `products` where `categories` = '".$productcat['categories']."'";
$result = $link->query($sql);
?>
<?php while ($product = $result->fetch_assoc()) : ?>
<div class="block">
<div class="image">
<img src=".<?= $product['image'] ?>">
</div>
<div class="text-block">
<div class="head-title">
<div class="text-title">
<h2><?= $product['name'] ?></h2>
</div>
<div class="price">
<span><?= $product['price'] ?> Р</span>
</div>
</div>
<div class="description line-clamp">
<p><?= $product['info'] ?></p>
</div>
<div class="ingredients-block-order">
<div class="ingredients-block line-clamp">
<?php $ingrs = explode(";", $product["ingr"]); ?>
<?php for ($i = 0; $i < count($ingrs); $i++) : ?>
<span class="ingredient"><?= $ingrs[$i] ?></span>
<?php endfor; ?>
</div>
<div class="laptop-product_bottom">
<button class="product_setup">
<div>
Купить
</div>
</button>
</div>
</div>
</div>
</div>
</div>
<? endwhile; ?>
<? endwhile; ?>
Поле date_read - по умолчанию NULL значит не прочитано. Для поля id задать счетчик auto_increment