2010-08-24 7 views
3

我有一個SQL查詢:如何編寫一個SQL查詢,它將返回一個項目的所有類別?

SELECT b . * , CONCAT(GROUP_CONCAT(c.name)) categories, CONCAT(GROUP_CONCAT(c.id)) cids 
FROM books b 
JOIN categories_of_books cb ON b.id = cb.book_id 
JOIN categories c ON c.id = cb.category_id 
GROUP BY b.id 

,並返回給我類別別名的所有書籍類別和的CID所有類別的ID。

當我加入WHERE子句是這樣的:

WHERE c.id = 10

類別我心底只有一個類別,它是顯而易見的。但我怎麼能寫SQL查詢將返回我的所有書籍類別類別,有限制條件別名:

WHERE c.id = 10

[編輯1]

只有變種:

SELECT b . * , GROUP_CONCAT(c.name) categories, GROUP_CONCAT(CAST(c.id AS CHAR)) cid 
FROM books b 
JOIN categories_of_books cb ON b.id = cb.book_id 
JOIN categories c ON c.id = cb.category_id 
WHERE b.id in (SELECT categories_of_books.book_id FROM categories_of_books join categories on categories_of_books.category_id = categories.id WHERE categories.id = 10) 
GROUP BY b.id 

你知道其他更好的變種嗎?

+0

請將上下文添加到您的問題的標題。 「可能嗎?」意味着什麼。 – Armbrat 2010-08-24 21:10:15

+0

好吧,我添加了上下文。 – 2010-08-24 21:12:59

+0

我想你可能會試圖在單個查詢中做太多事情。關注你的努力,編寫一個查詢,只是選擇所有類別WHERE book_id = 10。 – 2010-08-24 21:20:57

回答

1

什麼你問,這基本上是(如果我理解正確你的要求):

  • 對於在books表中的所有記錄,返回一行
  • 如果一本書有多個類別分配,對於列categories含有「category_1,category_2,類別3」,即,所有類別名稱的級聯
  • 只有當其中一類是categories.id = 10

你需要做的是選擇那些與ID類別的所有書籍開始什麼= 10:

SELECT cb.book_id 
FROM categories_of_books cb 
WHERE cb.category_id = 10 

現在你想去的地方,他們在該子集是所有的書:

SELECT b.* 
FROM books b 
WHERE b.id IN 
(
    SELECT cb.book_id 
    FROM categories_of_books cb 
    WHERE cb.category_id = 10 
) 

現在,您可以把它放回你的複雜分組查詢:

SELECT b.*, 
     CONCAT(GROUP_CONCAT(c.name)) categories, 
     CONCAT(GROUP_CONCAT(c.id)) cids 
FROM books b 
JOIN categories_of_books cb 
     ON b.id = cb.book_id 
JOIN categories c 
     ON c.id = cb.category_id 
WHERE b.id IN 
(
    SELECT cb.book_id 
    FROM categories_of_books cb 
    WHERE cb.category_id = 10 
) 
GROUP BY b.id 

這確實是我能想到的achiev沒有條理分明/更簡單的方法這個。順便說一句,值得花時間使用空白來代碼,正如我在上面所做的那樣,因爲通常認爲這樣更容易閱讀,任何需要在將來維護代碼的人都會很可能感謝你=)

+0

謝謝,但是我的第二個查詢(edit1)和你最後的查詢?它可以更優化嗎? – 2010-08-24 21:31:33

+0

@DimaKrasun,我剛剛看到您的修改,並且沒有真正的方法可以讓查詢變得與衆不同,儘管值得指出的是,我不擔心在我的子文件夾中將'categories_of_books'加入'categories'查詢,因爲它實際上沒有必要,這可能會使它稍微更優化=) – Rob 2010-08-24 21:33:41

+0

好吧,一秒鐘,我會嘗試您的查詢 – 2010-08-24 21:34:59

相關問題