Темы рубрики и их выборка

Духовность™

Продвинутый новичок
Темы рубрики и их выборка

Есть таблица статьи - articles и таблица из рубрик - articles_rubrics

Статьи имеют одно булево поле - article_main_rubric означающее, что это "главная тема рубрики"

На главной странице надо вывести анонсы всех рубрик. Подразумевается, что при выборке мы смотрим, есть ли "главная тема" у рубрики, т.е. ищем статью с article_main_rubric = 1. Если есть - выводим её анонс, если нет - выводим анонс последней добавленной статьи.

Пытаюсь сделать одним запросом:

[SQL]
SELECT
`rubric_name`,
`article_main_rubric`
FROM
`articles`,
`articles_rubrics`
WHERE
`articles`.`id_rubric` = `articles_rubrics`.`id_rubric`
GROUP BY
`article_main_rubric` DESC,
`articles`.`id_article` DESC
[/SQL]

но результат получается

Код:
Здоровье  	1
Активный отдых 	1
Секс 	        1
Свободное время 0
Свободное время 0
Бизнес 	        0
Секс 	        0
Автомобили      0

т.е. как видно, в выборке присутствует два раза данные статьи рубрики "Свободное время" - это потому, что статьям данной рубрики не назначена тема рубрики + их идентификаторы идут друг за другом.

Можно ли вообще данный пример решить 1 запросом?
 
Честно говоря, пропустил про последнюю статью)))
Но, все равно, должно получиться. Делаешь 2 джойна, один вытаскивает основную тему, второй - последнюю статью. Если в качестве основной приходит NULL - выводишь последнюю статью.
 
решить то можно, но как-то стрёмно у меня получилось:

Код:
SELECT *
FROM 
(
  SELECT ar.*, 
         (SELECT id FROM articles WHERE id_rubric=ar.id AND article_main_rubric = 1 ORDER BY id DESC LIMIT 1) as art_main, 
         (SELECT id FROM articles WHERE id_rubric=ar.id ORDER BY id DESC LIMIT 1) AS art_last
  FROM `articles_rubrics` AS ar
) AS t
JOIN articles AS a ON a.id = IFNULL(t.art_main, t.art_last)

запрос не тестил :)
ещё его можно доработать, чтоб он второй подзапрос вызывал только в случае когда нет записи с article_main_rubric=1. Но сначала нужно убедиться что этот работает.
 
[sql]
SELECT * FROM rubr as r
LEFT JOIN article as a ON a.rubr = r.id AND a.main = 1
LEFT JOIN article as a2 ON a2.rubr = r.id
LEFT JOIN article as a3 ON a3.rubr = r.id AND a3.id > a2.id
WHERE a3.id IS NULL
GROUP BY r.id
[/sql]
Вот так не покатит? Писал на коленке, правда.
Вообще, ИМХО, правильнее добавить в таблицу рубрик поле, в котором бы хранился id статьи, которая должна выводиться.
 
Bitterman
вариант интереcный, вот только за производительность немного сыкотно.
 
конечно, это объясняет всё.

ладно, щас проверю.

-~{}~ 19.09.08 18:15:

проверил свой запрос (только с другими именами таблиц и полей), работает и возвращает что я и ожидал.
 
Сверху