Получить первые записи из каждой группы
21 ноября 2021
Появилась задача, где у товаров есть несколько фотографий и нужно для каждого товара выбрать по одной картинке с шириной и высотой не менее 600 пикселей. Если подходящих картинок несколько, то выбирается изображение с наименьшим значением параметра sort.
Записи картинок хранятся в таблице table_images, а ID товара находится в поле iditem.
Запрос на выборку картинок:
Записи картинок хранятся в таблице table_images, а ID товара находится в поле iditem.
Запрос на выборку картинок:
SELECT
*
FROM
(
SELECT
`id`,
`iditem`,
`path`,
IF
(
/* сравнение переменной @iditem и поля `iditem` */
@iditem = `iditem`,
/* если сравнение = true, то увеличивается счётчик @row_num */
@row_num := @row_num + 1,
/*
если сравнение = false, то устанавливаем @row_num = 1 и с помощью функции LEAST
устанавливаем в @iditem значение поля `iditem`. Функция LEAST возвращает наименьшее
значение из списка аргументов, поэтому в качестве первого аргумента передаём 0 (ноль)
*/
@row_num := 1 + LEAST(0, @iditem := `iditem`)
) AS `duplicate_num`
FROM
`table_images`,
(SELECT @iditem := -1, @row_num := 0) AS V /* объявляем переменные @iditem и @row_num */
WHERE
`width` >= 600 AND
`height` >= 600
ORDER BY
`iditem` ASC,
`sort` ASC,
`id` ASC
) AS B
WHERE
`duplicate_num` = 1