MySQL Query с первыми 20 элементами, упорядоченными по одному полю, а остальные - по имени ASC - PullRequest
1 голос
/ 06 января 2012

У меня есть таблица базы данных, в которой есть два поля: дата и имя.

Я хочу, чтобы мой запрос сначала вытягивал первые 20 по самой новой дате, а затем оставшуюся часть запроса, чтобы остальные элементыназвание в алфавитном порядке.

Таким образом, сначала будут показаны 20 самых новых продуктов, а остальные будут упорядочены по имени.

Ответы [ 3 ]

4 голосов
/ 06 января 2012

Это немного уродливо, но вы можете сделать это одним запросом:

SELECT name,
       `date`
  FROM (  SELECT @rank := @rank + 1 AS rank,
                 name,
                 `date`
            FROM (SELECT @rank := 0) dummy
            JOIN products
        ORDER BY `date` DESC, name) dateranked
ORDER BY IF(rank <= 20, rank, 21), name;

Самый внутренний запрос, dummy, инициализирует нашу @rank переменную. Следующая производная таблица, dateranked, ранжирует все строки по дате (разрывая связи на name). Внешний запрос затем просто переупорядочивает строки по нашим вычисленным rank, обрабатывая ранги больше 20 как ранг # 21, а затем name.

ОБНОВЛЕНИЕ: Эта версия запроса более компактна, помещает логику условного ранжирования в крайний ORDER BY, использует IF () вместо CASE / END.

0 голосов
/ 06 января 2012

Используйте оператор sql UNION для объединения результатов двух запросов SELECT.

В соответствии с Документами MySQL :

использование ORDER BY для отдельных операторов SELECT ничего не подразумевает в порядке, в котором строки появляются в конечном результате, поскольку UNION по умолчанию создает неупорядоченный набор строк.

...

Для использованияпредложение ORDER BY или LIMIT для сортировки или ограничения всего результата UNION, заключения в скобки отдельных операторов SELECT и размещения ORDER BY или LIMIT после последнего.В следующем примере используются оба предложения:

(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

Редактировать: Я пропустил часть, объясняющую потребности OPотсортировать один набор результатов по дате и другой набор результатов по алфавиту.Я думаю, вам нужно создать временное поле для сортировки.И SQL-запрос будет что-то похожее на это.

(SELECT *, 'firstset' as set_id FROM t1 ORDER BY date LIMIT 0, 20)
UNION
(SELECT *, 'secondset' as set_id FROM t1 ORDER BY date LIMIT 20, 18446744073709551615)
ORDER BY 
CASE 
    WHEN set_id='firstset' THEN date 
    WHEN set_id='secondset' THEN name 
END DESC ;
0 голосов
/ 06 января 2012

Боюсь, что это нужно сделать, добавив специальный столбец в вашу таблицу или создав временную таблицу TPup.Если вы дадите мне знать, заинтересованы ли вы в этих опциях, я расскажу вам больше.

Возможен вариант с двумя запросами, подобный следующему, но моя версия MySQL сообщает, что LIMIT недоступенв подзапросах.

SELECT `date`, `name` from `table` ORDER BY `date` LIMIT 0, 20;
SELECT `date`, `name` from `table` WHERE `id` NOT IN (SELECT `id` from `table` ORDER BY `date` LIMIT 0, 20) ORDER BY `name`;
...