2014-01-05 6 views
0

I имеет структуру базы данных, как этогоMySQL запрос, чтобы получить заголовки из подкатегорий данного родителя

CATEGORIES 
ID | parent_id | name 
1 | 0   | sports 
2 | 1   | football 
3 | 1   | tennis 
4 | 0   | activities 
5 | 4   | hiking 
etc. 


NEWS 
ID | category_id | title    | date  | etc 
1 | 2   | Football is great | 2012-12-21 | 
2 | 3   | Tennis is healthy | 2012-11-13 | 
3 | 5   | Go on hiking  | 2013-11-15 | 

Теперь, когда я хочу, чтобы получить заголовки (наименования) подкатегорий «спорт», что лучший способ добиться этого?

Я думал о выполнении нескольких запросов (в этом случае 3).

Во-первых, получить все Чайлдс из «Спорт»

SELECT * FROM categories WHERE parent_id = 1 

Тогда для каждого результата сделать запрос, чтобы получить заголовки из каждой подкатегории.

SELECT * FROM news WHERE category_id = (result from query above) 

В этом примере будут выполнены 3 запроса. (Один для получения всех подкатегорий. В этом случае две подкатегории, поэтому в таблицу новостей будут выполняться два запроса, что составляет в целом 3.)

Или существует более умный (более эффективный) способ сделать это? Возможно, 1 запрос?

+0

Вы можете легко присоединиться к этим две таблицы. Какова связь между КАТЕГОРИЯМИ и НОВОСТЬМИ, это 1: 1 или 1: n? Действительно ли иметь категории без новостей? –

+0

Обратите внимание, что по соглашению мы используем NULL, а не 0 для сирот. – Strawberry

ответ

1

Вы должны быть в состоянии сделать это с помощью одного запроса с использованием INNER JOIN

SELECT NEWS.*, CATEGORIES.name 
FROM NEWS 
INNER JOIN CATEGORIES ON NEWS.category_id = CATEGORIES.ID 

Вы также можете написать запрос с использованием LEFT JOIN. Это позволит вам перечислить все категории, в том числе без новостных статей.

SELECT categories.name as Category_Name, news.* 
FROM categories 
LEFT JOIN news ON news.category_id = categories.ID 

Я поместил это в SQL Fiddle, чтобы помочь продемонстрировать: http://sqlfiddle.com/#!2/9c1b3/6

+0

Большое вам спасибо! – SunAmonRa

Смежные вопросы