|
|
|
| Здравствуйте.
Можно как-нибудь ставить ограничения на выборку в одном запросе.
Например есть таблица с людьми.
people
| id | fname | sname | click_count | regDate |....
Вот и надо отсортировать таблицу хитро: сначала чтобы шли люди добавленные в последние 14 дней (поле regDate), потом у кого самый большой рейтинг (click_count), потом по фамилии(sname), ну и возможно ещё по чему нибудь... важны именно певые два парметра сортировки именно в этом порядке.
Можно это как-то сделать в один запрос? И если нельзя как оптимальнее всего.
Сейчас я сначала выбираю людей за последние 14 дней записываю в массив, затем остальных, записываю в массив а потом объединяю массивы и вывожу...
Но мне кажется как-то коряво получается 2 похожих запроса в одной и той же таблице... | |
|
|
|
|
|
|
|
для: Axxil
(06.08.2005 в 11:59)
| | В один вряд ли получится... даже если бы не было сортировки и можно было бы объединить их при помощи UNION, это всё равно было бы эквивалентно трём запросам, так что лучше двумя запросами вытащить: первый за 14 дней, второй - всё остальное. Не очень ясные критерии перехода от сортировки по рейтингу к фамилиям - до какого рейтинга должна происходить сортировка по рейтингу...
PS А вообще достаточно сложный интерфейс получается - может предусмотреть сортировку по нескольким критериям: дате, рейтингу и фамили? Как у нас в списке авторов http://www.softtime.ru/forum/authorslist.php?id_forum=1&page=&order=time | |
|
|
|
|
|
|
|
для: cheops
(06.08.2005 в 12:15)
| | Нет я не правильно выразился
это как бы альбом с фотографиями и чем больше фотку человека смотрят посетители тем ближе она подбирается к первой странице. Так же в базе есть флаг, признак первой страницы то есть если он равен 1 то человек принудительно размещается в первой тридцатке (на первой странице), то есть по нему надо тоже сортировать. сейчас это так ... order by fl_first_page,click_count,sname
то есть сортируется по fl_first_page,click_count, но в алфавитном порядке/
А запрос по 14 дням необходим чтобы только что добавленные в альбом люди красовались на первой странице 14 дней.
Как бы вы реализовали?
Можно в лоб конечно как я описал выше, но таблица с людьми большая 15000 записей и растёт быстро, хотелось бы оптимальнее сделать... | |
|
|
|
|
|
|
|
для: Axxil
(06.08.2005 в 12:30)
| | Мне кажется что так:
SELECT * FROM people WHERE regDate > NOW() - INTERVAL 14 DAY ORDER BY click_count DESC
|
| |
|
|
|
|
|
|
|
для: Loki
(06.08.2005 в 14:08)
| | Согласен, так мы вытащим всех кто младше 14 дней, а как быть с остальными? | |
|
|
|
|
|
|
|
для: Axxil
(06.08.2005 в 18:19)
| |
SELECT * FROM people WHERE regDate > NOW() - INTERVAL 14 DAY OR WHERE flag=1 ORDER BY click_count DESC
|
| |
|
|
|
|
|
|
|
для: Loki
(06.08.2005 в 18:41)
| | опять же вытаскиваем только 14 дневных и тех у кого флаг 1 а остальные отсеиваются...
Блин я так понимаю по-любому в один запрос не получится... | |
|
|
|
|
|
|
|
для: Axxil
(06.08.2005 в 18:49)
| | Одним нет, да и не надо к этому стремится - один запрос, вместо двух вовсе не означает, что он будет в два раза быстрее выполняться... Главная задача, чтобы приложение работало - заботится о скорости при современной вычислительной технике следует только тогда, когда она начинает буксовать (я этого не наблюдал лет уже 5). | |
|
|
|
|
|
|
|
для: cheops
(06.08.2005 в 19:20)
| | Накопал вот такой манёвр:
<?
$sql_str='select * from people order by if((regDate > NOW() - INTERVAL 14 DAY),0,1),click_count,fl_first_page,sname';
?>
|
Поль Дюбуа "MySQL сборник рецептов". Рекомендую просто библия mySQL!!!
Как он по скорости?
И вообще как и где можно оценить скрость выполнения запроса?
Так вот я и не заботился об оптимизации пока сервер БД не упал :) | |
|
|
|
|
|
|
|
для: Axxil
(06.08.2005 в 19:32)
| | Хм... скорее всего хорошо, ведь временые типы - это целочисленные типы и здесь вычисление должно происходить быстро. | |
|
|
|
|
|
|
|
для: Axxil
(06.08.2005 в 18:49)
| | Перечитайте внимаетльно запрос: используется or а не and. | |
|
|
|
|
|
|
|
для: Loki
(06.08.2005 в 21:36)
| | так и я о том же :)
если бы было and то это были бы только все 14-ти дневные с признаком первой страницы | |
|
|
|
|
|
|
|
для: Axxil
(06.08.2005 в 11:59)
| | Как такой вариант - добавиьт в таблицу необязательное поле novice со значениями 1 или 0. Присваивать единицу новичкам (записям моложе 14-ти дней), а у более старых обнулять. Тогда при выводе отсортировать сначала по этому полю, и вверху окажутся записи последних двух недель. | |
|
|
|