2012-12-05 109 views
1

tblProjects鏈接到tblPrCatt1_id - 兩個表中的列。 tblCategories鏈接到tblPrCatt3_id-在兩個表中的列。 一個項目可能有幾個類別。MySQL從表1中選擇一行,從表3中選擇幾個

tblProjects 
t1_id 
t1_name 

tblPrCat 
t1_id 
t3_id 

tblCategories 
t3_id 
t3_name 

我試圖用一個單一的SELECT -sentence獲得項目(或10)的值,並獲得對應於每個項目的類別中的所有名稱。

這可能在一個單一的SELECT -sentence每個項目返回一行,但多個類別?

回答

3

你可以嘗試這樣的查詢:

SELECT 
    tblProjects.name AS project, 
    tblCategories.name AS category 
FROM 
    tblProjects 
    INNER JOIN tblPrCat USING (t1_id) 
    INNER JOIN tblCategories USING (t3_id) 
WHERE 
    /* Your search criteria here */ 

注意:你會看到每個項目相關的所有類別名稱,但如果有一個以上的類別每個項目,你」會看到什麼似乎是重複的項目名稱。準備在代碼中處理這個問題。

編輯: 我假設(可能是錯誤的),每個項目至少有一個類別。爲了確保你也看到沒有項目名稱,而是使用此:

SELECT 
    tblProjects.name AS project, 
    IFNULL(tblCategories.name, 'No categories!') AS category 
FROM 
    tblProjects 
    LEFT JOIN tblPrCat USING (t1_id) 
    LEFT JOIN tblCategories USING (t3_id) 
WHERE 
    /* Your search criteria here */ 

編輯: 顯示每個項目只有一次,但顯示的類別名稱的總結作爲一個逗號分隔的列表,使用此:

SELECT 
    tblProjects.name AS project, 
    IFNULL(GROUP_CONCAT(tblCategories.name), 'No categories!') AS category 
FROM 
    tblProjects 
    LEFT JOIN tblPrCat USING (t1_id) 
    LEFT JOIN tblCategories USING (t3_id) 
WHERE 
    /* Your search criteria here */ 
GROUP BY 
    tblProjects.t1_id 
+0

謝謝你,有人包括使用替代山坳=關口 – WebChemist

1
SELECT * FROM 
    tblProjects p , 
    tblPrCat pc , 
    tblCategories c 
WHERE 
    c.t3_id = pc.t3_id 
AND 
    p.t1_id = pc.t1_id 
AND 
    p.t1_id = '1' 
2

您可以使用連接:

SELECT p.t1_name, c.name 
FROM tblProjects p 
LEFT JOIN tblPrCat prc ON (p.t1_id = prc.t1_id) 
LEFT JOIN tblCategories c ON (c.t3_id = prc.t3_id) 

請注意,這將多次列出項目。即

Project1 Cat1 
Project1 Cat2 
Project2 Cat1 

或者您可以使用組的毗連,如果你只是想看到每個項目一次:

SELECT p.t1_name, GROUP_CONCAT(c.name) 
FROM tblProjects p 
LEFT JOIN tblPrCat prc ON (p.t1_id = prc.t1_id) 
LEFT JOIN tblCategories c ON (c.t3_id = prc.t3_id) 
GROUP BY p.t1_id 

將產生:

Project1 Cat1, Cat2 
Project2 Cat1