Упростите SQL-запрос нескольких операторов SELECT, каждый с помощью UNION и LIMIT

0

Нужна помощь в упрощении этого SQL-запроса, возможно, к одному SELECT:

(SELECT * FROM 'deals'
WHERE category_id = 1
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 2
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 4
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 5
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 6
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 8
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 9
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 10
ORDER BY id desc
LIMIT 10)
UNION
(SELECT * FROM 'deals'
WHERE category_id = 17
ORDER BY id desc
LIMIT 10)

Мне сказали попробовать использовать GROUP BY и HAVING. Тем не менее, любой запрос, который я пробовал, не работает ни малейшим образом...

Любая помощь будет оценена!

EDIT - извинения, забыл упомянуть механизм базы данных MySQL

  • 0
    Это уже один выбор, не так ли?
Теги:
union
sql-limit

3 ответа

1

Вы можете сконденсировать это с помощью оконной функции, чтобы ограничить каждое ведро группы до 10.

SELECT
    *
FROM
(
    SELECT 
        *,
        ROW_NUMBER() OVER PARTITION BY(category_id ORDER BY id DESC) AS GroupOrder
    FROM 'deals'
    WHERE category_id BETWEEN 1 AND 10
)AS X
WHERE
    GroupOrder<=10
  • 1
    Вы не упомянули свою RDMS. Если MySQL, то в этой статье обсуждается, как эмулировать ROW_NUMBER. log4code.com/alternative-to-row_number-in-mysql
  • 0
    Обратите внимание, что если вы используете MySQL, вы должны использовать MySQL 8.0 или более позднюю версию, чтобы иметь доступ к функции ROW_NUMBER (). Для MariaDB вы должны использовать 10.2.0 или более позднюю версию. Большинство других РСУБД имели эту функцию в течение многих лет.
Показать ещё 1 комментарий
0

Для более старых версий MySQL без оконных функций здесь приведен код.

SELECT T1.ID, T1.Category_ID, T1.Name
FROM (
SELECT  @row_num := IF(@prev_value=concat_ws('',t.Category_ID),@row_num+1,1) AS RowNumber
         ,t.*
         ,@prev_value := concat_ws('',t.Category_ID)
    FROM data t,
         (SELECT @row_num := 1) x,
         (SELECT @prev_value := '') y
   ORDER BY t.Category_ID
   ) T1
  WHERE T1.RowNumber < 10
  AND T1.Category_ID IN (1,2,3,4,5,6,7,8,9,10)

Вам нужно будет добавить необходимые имена полей для другого выбора.

Это использует описанную здесь методику

0

Я не уверен, мне нужно знать, нужен ли вам этот лимит в 10 баллов, так ли это, например, 10 лучших из этих вещей?

если нет, то

SELECT * FROM 'deals'
WHERE category_id between 0 and 10 or category_id=17
ORDER BY category_id asc,  id desc
  • 0
    Ограничение совершенно необходимо, но было бы неплохо включить. Точно так же, потянув 10 лучших предметов со стола
  • 0
    У вас есть другое поле, которое считает их или что-то подобное? таким образом, мы могли бы использовать его, чтобы сохранить топ-10 .... SELECT * FROM deals ГДЕ id> 11 и (category_id между 0 и 10 или category_id = 17) ORDER BY category_id asc, id desc
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню