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

Духовность™

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

Есть таблица статьи - 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 запросом?
 

Bitterman

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

Gas

может по одной?
решить то можно, но как-то стрёмно у меня получилось:

Код:
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. Но сначала нужно убедиться что этот работает.
 

Bitterman

Новичок
[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 статьи, которая должна выводиться.
 

Gas

может по одной?
Bitterman
вариант интереcный, вот только за производительность немного сыкотно.
 

Gas

может по одной?
конечно, это объясняет всё.

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

-~{}~ 19.09.08 18:15:

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