MySQL从表1中选择一行,从表3中选择几行

时间:2012-12-05 01:48:44

标签: mysql sql

tblProjectstblPrCat的{​​{1}} - 两个表中的列相关联。 t1_idtblCategories tblPrCat - 两个表中的列相关联。 一个项目可能有几个类别。

t3_id

我正在尝试使用单个tblProjects t1_id t1_name tblPrCat t1_id t3_id tblCategories t3_id t3_name - 句子来获取项目的值(或10)并获取与每个项目相对应的所有类别的名称。

这可能在单个SELECT - 句子中为每个项目返回一行但是多个类别吗?

3 个答案:

答案 0 :(得分: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 */

注意:您将看到与每个项目关联的每个类别名称,但如果每个项目有多个类别,您将看到看似重复的项目名称。准备好在你的代码中处理这个问题。

修改 我假设(可能错误地)每个项目至少有一个类别。要确保您还看到项目名称为none,请使用以下代码:

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

答案 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

或者,如果您只想查看每个项目一次,则可以使用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

答案 2 :(得分: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'