правильный MySql запрос

217
06 мая 2018, 20:47

Есть таблица Товаров. Таблица разделена на id,name...,category. Сейчас имею 5 категорий. При этом товаров примерно 380. Как одним запросом достать из БД по 50 товаров каждой категории.

Answer 1

Надо пронумеровать строки в разрезе категорий и взять те, чьи номера меньше 50. В MySQL это можно сделать с помощью переменных, с запоминанием категории предыдущей строки при сортировке по категории. Если в итоге нужны какие то конкретные 50 записей, а не первые попавшиеся, то надо добавить соответствующие поля в сортировку.

select *
  from (
    select *,
           @num:=if(@grp=category, @num+1, 1) N,  -- Текущий номер строки равен
           -- Номеру из предыдущей +1, если категория совпадает с предыдущей строкой
           -- Или 1, если категория сменилась
           @grp:=category  -- Запоминаем текущую категорию
           -- (присвоение происходит после вычисления предыдущего поля, т.е. @num)
      from table_c,
           (select @num:=0, @grp:=NULL) x  -- Инициализируем переменные
     order by category
  ) X
 where N<=50
Answer 2

Рабочий вариант:

(SELECT * FROM goods WHERE `category` = 1 LIMIT 50) 
UNION ALL 
(SELECT * FROM goods WHERE `category` = 2 LIMIT 50) 
UNION ALL 
(SELECT * FROM goods WHERE `category` = 3 LIMIT 50) 
UNION ALL 
(SELECT * FROM goods WHERE `category` = 4 LIMIT 50) 
UNION ALL 
(SELECT * FROM goods WHERE `category` = 5 LIMIT 50)

Если требуется более универсальное решение (f.e. заранее не известны номера категорий), то либо писать скрипт, либо создавать хранимую функцию, и обращаться к ней.

Answer 3
WITH s AS (SELECT DISTINCT p.category, 
    (SELECT id FROM product WHERE category = p.category ORDER BY id LIMIT 1 OFFSET 50) FROM product p)
SELECT * FROM product p
JOIN s ON s.category = p.category
WHERE p.id < s.id order by p.category;

PS По поводу валидности в MySql не уверен

READ ALSO
Железнодорожный вокзал

Железнодорожный вокзал

База данных "продажа билетов жд вокзала"Знатоки, подскажите, правильно составлена БД реляционная? Связи в схеме привязываются по ключам "№ поезда...

220
Ошибка подключения к бд 10061 MySQL

Ошибка подключения к бд 10061 MySQL

Установил MySQL, зашел в воркбенч, создал бдПосле перезагрузки ПК появилась ошибка

186
Списки инициализации

Списки инициализации

Расскажите в чем принципиальная разница между такими записями

203
Неблокирующий TCP сервер на С или С+

Неблокирующий TCP сервер на С или С+

Получил задание: "реализовать неблокирующий TCP сервер на С или С++"Как делать не понимаю от слова совсем

249