Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > сортировка выборки по двум параметрам


Автор: h8every1 30.7.2007, 04:08
есть выборка, которая выдаёт похожие новости - 

Код

SELECT id, title, date, alt_name, MATCH (title, keywords) AGAINST ('$body') AS relev
FROM " . PREFIX . "_post
WHERE MATCH (title, keywords) AGAINST ('$body')
AND id != ".$row['id']."
AND approve='1'
AND date < '".$thisdate."'
LIMIT 5


нужно, чтобы после того как были выбраны 5 самых подходящих, они были отсортированы по дате. просто сделать ORDER BY relev DESC, date DESC - не подходит, т.к. будет искать сперва с одинаковыми числом в поле relev, а это практически не возможно, и только если найдёт статьи с одинаковыми значениями, отсортирует их по дате.

на одном форуме мне посоветовали сортировать массив, который получается на выходе, т.к. поле date я тоже выбираю. но я не представляю как это сделать. подскажите, пожалуйста, ссылки в которых можно почитать как PHP работает с результатами БД?

Автор: Fally 30.7.2007, 09:49
Цитата

ORDER BY relev DESC, date DESC - не подходит

а что мешает написать вот так: ORDER BY date DESC, relev DESC ? Ведь тогда он сначала от сортирует по дате, а уже потом по полю relev

Автор: h8every1 30.7.2007, 09:59
Fally, в том-то и дело - надо выбрать не последние новости, а самые похожие. а они могли быть и месяц назад, и два.

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

не то. но спасибо за попытку =)

Автор: sTa1kEr 30.7.2007, 11:53
h8every1, сделайте через вложенный селект. Не самый практичный, но самый простой способ.
Код

SELECT * FROM
(SELECT id, title, date, alt_name, MATCH (title, keywords) AGAINST ('$body') AS relev
FROM " . PREFIX . "_post
WHERE MATCH (title, keywords) AGAINST ('$body')
AND id != ".$row['id']."
AND approve='1'
AND date < '".$thisdate."'
ORDER BY relev DESC
LIMIT 5) AS t
ODER BY t.date DESC

Автор: h8every1 30.7.2007, 13:03
Цитата(sTa1kEr @  30.7.2007,  16:53 Найти цитируемый пост)
h8every1, сделайте через вложенный селект.


хех. были у меня такие мысли. и даже сделал до этого. но, к сожалению, версия MySQL , которая на сервере стоит (5.0.26) не поддерживает LIMIT в подзапросе. не знаю, поддерживает ли вообще какая-нибудь =)

мне бы что-нибудь с результатом запроса наколдовать. или в php всё только по одной записи передается?
в идеале было бы просто весь массив выборки отсортировать по полю 'date' - оно же тоже выбирается... но как?

хотя не. я не так делал. попробую, спасибо =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)