Вот два способа фактически контролировать, какую строку вы получаете в MySQL, когда вы хотите первую строку для группы
Использование предела 1
SELECT products.id,
products.title,
products.size,
products.price,
products.text_description,
products.main_description,
products.priority,
gallery.id,
gallery.main
FROM products
CROSS JOIN
(SELECT
gallery.id,
gallery.main
FROM
gallery
WHERE
products.[id] = gallery.[id]
ORDER BY
gallery.[timestamp] DESC
LIMIT 1) gallery
GROUP BY
products.priority ASC
Теперь это тоже работает.
Использование MAx ()
SELECT products.id,
products.title,
products.size,
products.price,
products.text_description,
products.main_description,
products.priority,
gallery.id,
gallery.main
FROM products
INNER JOIN gallery
ON products.id = gallery.id
INNER JOIN
(SELECT
max(gallery.timestamp) timestamp,
gallery.[id]
FROM
gallery
GROUP BY
gallery.[id]
) maxgallery
ON gallery.id = maxgallery.id and gallery.timestamp = maxgallery.timestamp
GROUP BY
products.priority ASC
Помимо потенциальных различий в производительности, вы должны уделить особое внимание тому, как эти два запроса обрабатывают связи
Если есть две записи, которые совместно используют id и метку времени, используя LIMIT 1
, будет возвращена только одна запись. При использовании MAX()
может быть возвращено более одной записи.
Я оставлю это вам, какой из них предпочтительнее или если это вообще что-то меняет.