2013-08-24 96 views
0

選擇最新更新類別我有一個MySQL數據庫,並有一個categories表是這樣的:根據自己的項目

id name   parent 
-------------------------- 
1 News   0 
2 Analysis  0 
3 Europe   1 
4 Middle East  1 
5 Asia   1 
6 Americas  1 
7 Commentaries 2 
8 Interviews  2 
9 Articles  2 
10 Reports   2 

而一個items表是這樣的:

id created     catid title 
--------------------------------------------- 
1 2013-08-12 20:15:00  3  Foo 
2 2013-08-12 19:15:00  3  Bar 
3 2013-08-12 18:15:00  4  Foobar 
4 2013-08-12 17:15:00  4  Barfoor 
5 2013-08-12 16:15:00  8  Boofar 
6 2013-08-12 15:15:00  9  Farfar 
7 2013-08-11 16:45:00  10  Farfarbar 
8 2013-08-11 16:15:00  5  Foofoobar 
10 2013-08-10 16:15:00  7  Foobarbar 

我要的是列表到屬於指定父項的子項的類別,並具有最新項目。例如,如果我想新聞(CATID = 1)節的最新更新類別,結果將是:

3 Europe 
4 Middle East 
5 Asia 

注意,結果被他們的最後更新時間排序。

請認爲由於大量的記錄,查詢的性能非常重要。

回答

2

聯接作品漂亮快速。然後使用group by啓用聚合MAX()-功能對輸出進行排序。

WHERE-clause中,您可以選擇要搜索的父代號。

SELECT c.id, c.name 
FROM categories c 
INNER JOIN items i 
ON c.id = i.catid 
WHERE c.parent = 1 
GROUP BY c.id 
ORDER BY MAX(i.created) DESC 

SQL-Fiddle

編輯

在只有單一的嵌套的情況下,可以按如下方式更改查詢:

SELECT c.id, c.name 
FROM categories c 
INNER JOIN items i 
ON c.id = i.catid 
WHERE c.parent = 1 
OR c.parent IN (SELECT id FROM categories WHERE c.parent = 1) 
GROUP BY c.id 
ORDER BY MAX(i.created) DESC 

SQL-Fiddle

我如果需要更多嵌套,則需要創建存儲過程。 有關詳情,請參閱here

+0

謝謝,它似乎正在工作,但如果類別變得更深一層或多層?這有可能做到嗎? (我知道我沒有在我的問題中提到它!) –

+0

@faridv我的查詢與這個之間有什麼區別? –

+0

@NaveenKumar:排序... –

1

你似乎只想要一個特定類別的孩子。看來,你問這類別行有1父母,必須在items錶行:

select c.id, c.name 
from categories c 
where c.parent = 1 and 
     exists (select 1 from items i where i.catid = c.id); 

編輯:

我不知道你所說的「最新」的項目是什麼意思。但是你可以通過做檢查最近10個在項目表:

select c.id, c.name 
from categories c 
where c.parent = 1 and 
     exists (select 1 
       from (select i.* 
        from items i 
        order by created desc 
        limit 10 
        ) i 
       where i.catid = c.id) 
      ); 

或使用聯接:

select c.id, c.name 
from categories c join 
    (select i.* 
     from items i 
     order by created desc 
     limit 10 
    ) i10 
    on i.catid = c.id 
where c.parent = 1 
group by c.id, c.name 
order by max(created) desc; 
+0

你在哪裏提到查詢中最新的更新類別? –

+0

最新意味着更新的基礎上創建的字段。 –

+0

@faridv。 。 。我不明白這個問題。您希望按創建日期排序結果*。我原本以爲你只是過濾項目表。 –

1

這裏是SQLFiddle

SELECT i.catid, c.name FROM items i 
    JOIN categories c ON i.catid=c.id 
    WHERE c.parent=1 
    GROUP BY i.catid 
    ORDER BY MAX(i.created) DESC; 
+0

我想要上次更新的類別。其中有最新項目的類別。 –

+0

@faridv http://sqlfiddle.com/#!2/f7e19/5 –