1

tblProjectstblPrCat与两个表中的t1_id-columns 链接。与两个表中的-columnstblCategories链接。一个项目可能有几个类别。tblPrCatt3_id

tblProjects
t1_id
t1_name

tblPrCat
t1_id
t3_id

tblCategories
t3_id
t3_name

我正在尝试使用单个SELECT句子来获取项目的值(或 10 个)并获取与每个项目对应的类别的所有名称。

这是否可能在单个SELECT句子中返回每个项目的单行但多个类别?

4

3 回答 3

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
于 2012-12-05T01:54:21.450 回答
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)

请注意,这将多次列出项目。IE

Project1    Cat1
Project1    Cat2
Project2    Cat1

或者,如果您只想查看每个项目一次,您可以使用 Group Concat:

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
于 2012-12-05T01:55:29.800 回答
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'
于 2012-12-05T01:52:58.837 回答