Получить первые записи из каждой группы

21 ноября 2021
Появилась задача, где у товаров есть несколько фотографий и нужно для каждого товара выбрать по одной картинке с шириной и высотой не менее 600 пикселей. Если подходящих картинок несколько, то выбирается изображение с наименьшим значением параметра sort.

Записи картинок хранятся в таблице 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