[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нужно отсортировать а потом выбрать
Nuzhser
Здравствуйте,
Вопрос следующий как сделать так чтобы из таблицы были выбраны 30 строк . Понятно что мы имеем старт и лимит 30 для этого. Но перед этим есть нужда отсортировать все строки по одному полю с ид таким образом чтобы все строки с ид 5(оно не уникально их много) шли вконце таблицы а уж потом выбрать по нашим параметрам старт и лимит.

_____________
Лэт ит би
rooor
а обычный запрос не справится с этой задачей?
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
Nuzhser
Это не подходит. Кроме того задача становиться сложной. Те строки которые имеют ид не равным 5 должны быть отсортированы по дате до выборки тоже. А уж в самом конце должна идти выборка по количесту от и до.

_____________
Лэт ит би
rooor
не понял)
покажите таблицу с данными и как надо отсортировать чтобы выбрать нужное
Nuzhser
Ну например есть такая таблица
prod_id --- status --- date_added --- name
1 -- ----- 6 -- 2012-06-22 17:48:00 -- prod_1
2 -- ----- 7 -- 2012-07-21 17:48:00 -- prod_2
3 -- ----- 5 -- 2012-08-12 17:48:00 -- prod_3
4 -- ----- 5 -- 2012-08-22 17:48:00 -- prod_4
5 -- ----- 5 -- 2012-10-30 17:48:00 -- prod_5
6 -- ------ 8 --2012-11-22 14:48:00 -- prod_6
7 -- ----- 5 -- 2012-12-22 17:48:00 -- prod_7

_____________
Лэт ит би
Nuzhser
Надо чтобы в самом конце шла выборка по параметрам start limit а до того данные были отсортированы сначала так чтобы все строки что имеют status 5 шли вконце и еще и те что не имеют этого статуса шли от самого раннего до самого позднего по дате. Вот такая головоломка)



_____________
Лэт ит би
Nuzhser
А че направление правильное) только работает вот так
SELECT
*
FROM (
(
SELECT * FROM product WHERE status != 5 ORDER BY date_added DESC)
UNION ALL
(SELECT * FROM product WHERE status = 5)
)
AS res
LIMIT 60, 30;

Если не задать AS res то мускул материться что нет элаиса

спасибо Лекафе

_____________
Лэт ит би
Placido
А почему не так:
SELECT * FROM product  ORDER BY status = 5, date_added DESC LIMIT 60, 30;
Nuzhser
Лажа не подходит никакой вариант на данный момент вопрос открыт. Плачидо не подходит потому что мне перед выборкой надо сделать сортировку и уже с отсортированного сделать выборку по количеству. Причем эта сортировка должна затронуть только часть таблицы.
Но и тот вариант который я указал как рабочий не делает сортировку. Как оказалось мускул при использовании UNION начисто не видит необходимости что либо сортировать поэтому по дате я не получаю ничего хотя остальное по параметрам выбираеться корректно и обьединяется

_____________
Лэт ит би
Placido
Цитата (Nuzhser @ 16.10.2013 - 17:08)
Плачидо не подходит потому что мне перед выборкой надо сделать сортировку и уже с отсортированного сделать выборку по количеству.

А у меня как? Мой запрос сначала сортирует так, чтобы записи со status = 5 были в конце, а потом все (в т.ч. и со статусом status = 5) - по дате, а из отсортированного выбирает записи с LIMIT 60, 30.
Nuzhser
Уже боюсь накаркать но вроде теперь работает корректно
(
SELECT *
FROM (

SELECT *
FROM product
ORDER BY date_added DESC
) AS res
WHERE status != 5
)
UNION ALL (

SELECT *
FROM product
WHERE status = 5
)
LIMIT 60 , 30


ТО есть что делает данный запрос
1. Сортирует все в таблице по дате ORDER BY date_added DESC
2. Из отсортированного в 1 пункте выбирает те строки где нет 5 в колонке status WHERE status != 5
3. Отбирает из таблице все где есть 5 в колонке status и присоединяет это к результату пункта 2. WHERE status = 5
4. Из полученного массива строк отбирает нужное нам количество начиная с 60-й строки и до 89 LIMIT 60 , 30

_____________
Лэт ит би
Nuzhser
Плачидо у меня была потребность отсеять некоторые строки и присоединить их вконце таблицы, а то что сначала отсортировать по дате и в конце при выборке получить по количеству строки

_____________
Лэт ит би
Nuzhser
Блин Плачидо по ходу дела твой вариант тоже вроде работает и даже быстрее.)))
Так тогда возникает вопрос зачем я столько мучился)))))))

_____________
Лэт ит би
Placido
О чем я и говорю. Зачем юнионы и вложенные запросы, если можно обойтись одним. К вопросу о быстродействии. На полях status и date_added индексы стоят?
Nuzhser
Соглашаюсь там где меньше кода больше быстродействия. И я так увидел что там можна даже вот так писать
SELECT * FROM product  ORDER BY status > 1 DESC, date_added DESC LIMIT 60, 30;


_____________
Лэт ит би
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.