2014-10-26 60 views
1

我正在爲論壇創建一個簡單的數據庫。我有一個欄目表forum_categories看起來像這樣:爲多個值編寫一個SQL查詢

`cat_id` INT(8) NOT NULL AUTO_INCREMENT, 
`cat_title` VARCHAR(255) NOT NULL, 
`cat_desc` TEXT NOT NULL, 
PRIMARY KEY (`cat_id`), 
UNIQUE KEY (`cat_title`) 

而一個主題表forum_topics看起來像這樣:

`topic_id` INT(8) NOT NULL AUTO_INCREMENT, 
`cat_id` INT(8) NOT NULL COMMENT 'foreign key with forum_categories table', 
`user_id` INT(11) NOT NULL COMMENT 'foreign key with users table', 
`topic_title` VARCHAR(255) NOT NULL, 
`topic_desc` TEXT NOT NULL, 
`topic_date` DATETIME DEFAULT NULL, 
PRIMARY KEY (`topic_id`), 
FOREIGN KEY (`cat_id`) REFERENCES forum_categories (`cat_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='forum topics'; 

現在,當我選擇產品分類我只是想的主題展示,其中cat_id字段彼此相等。

實施例:
第1類具有CAT_ID = 1
類別2具有CAT_ID = 2

主題1具有CAT_ID = 1
主題2具有CAT_ID = 2

現在當選擇類別1時,我只想要顯示主題1。如果選擇category2,我只想要顯示topic 2。
這個查詢實現了:

SELECT * 
FROM forum_categories fc 
JOIN forum_topics ft ON fc.cat_id = ft.cat_id 
WHERE fc.cat_id = 1 
ORDER BY ft.topic_date DESC 

現在,我想不必針對每個類別的一個查詢,如果這是可能的。試圖做到這一點:

SELECT * 
FROM forum_categories fc 
JOIN forum_topics ft ON fc.cat_id = ft.cat_id 
WHERE fc.cat_id = ft.cat_id 
ORDER BY ft.topic_date DESC 

或本:

SELECT * 
FROM forum_categories fc 
JOIN forum_topics ft ON fc.cat_id = ft.cat_id 
ORDER BY ft.topic_date DESC 

顯示主題1和2兩個類別。有沒有辦法爲所有類別提供一個查詢?

+0

而不是使用「using」用於適當的別名,如fc.cat_id = ft.cat_id – SMA 2014-10-26 16:09:59

+0

什麼是別名? – Schwesi 2014-10-26 16:12:09

+0

類似於SELECT * FROM forum_categories fc JOIN forum_topics ft on fc.cat_id = ft.cat_id ORDER BY ft.topic_date DESC – SMA 2014-10-26 16:13:56

回答

0

如果你想創建一個所有類別拉這個數據的查詢,您可以加入兩個表一起,條件是該CAT_ID是等於。這將是這個樣子:

SELECT * 
FROM forum_categories fc 
JOIN forum_topics ft ON fc.cat_id = ft.cat_id 
ORDER BY ft.topic_date DESC; 

如果您想查詢特定的類別,你可以把你的WHERE語句,就像這樣:

SELECT * 
FROM forum_categories fc 
JOIN forum_topics ft ON fc.cat_id = ft.cat_id 
WHERE fc.cat_id = 1 // Or whatever you want. 
ORDER BY ft.topic_date DESC; 

我想一個問題,你可能會你希望這是可重用的,你可以在其中編寫一個查詢並根據需要更改cat_id。如果是這種情況,我建議你查看準備好的陳述。

準備好的語句所做的是創建一個帶有根據需要插入的參數值的查詢。這裏有一個例子:

PREPARE stmnt FROM 
    'SELECT * 
    FROM forum_categories fc 
    JOIN forum_topics ft ON fc.cat_id = ft.cat_id 
    WHERE fc.cat_id = ? 
    ORDER BY ft.topic_date DESC'; 

SET @a = 1; 

EXECUTE stmnt USING @a; 

當你做到這一點,你可以指定任何你想要一個新的變量(@b,@c)。你所要做的就是每次調用EXECUTE stmnt,而不必總是重寫那個查詢。

這是一個SQL Fiddle,涵蓋了我所有的三個例子。

這是對MySQL prepared statements的參考。

+0

哇!多麼驚人的答案!非常感謝!!!我無法升級,但我會盡快獲得足夠的聲望。 – Schwesi 2014-10-26 18:25:11

+0

沒有必要強調它 - 我來這裏幫忙,那就是我所做的。這是一個很好的問題,我給它+1。不斷詢問這些棘手的發人深省的問題,並立即建立起自己的聲譽。 – AdamMc331 2014-10-26 18:34:41

0

請嘗試以下方法:

SELECT * 
    FROM forum_categories fc 
    JOIN forum_topics ft 
    ON fc.cat_id = ft.cat_id 
WHERE fc.cat_id = 1 -- or whatever category you want 
ORDER 
    BY ft.topic_date DESC 
+0

不幸的是不能解決問題。 – Schwesi 2014-10-26 16:10:30

+0

是否有任何錯誤訊息?你可以發佈嗎? – DirkNM 2014-10-26 16:11:06

+0

沒有錯誤消息,它只是顯示所有主題,無論我選擇哪種分類。那麼我想我在那裏犯了一個錯誤。感謝您的幫助! – Schwesi 2014-10-26 16:16:07

0
SELECT 
    cat_title, 
    cat_desc, 
    topic_title, 
    topic_desc 
FROM forum_categories 
INNER JOIN forum_topics 
    USING(cat_id) 
WHERE cat_id = x;