MySQL查询连接三个表

时间:2012-08-04 06:44:47

标签: php mysql database

我有三个表:项目,列表,项目。

项目加入project_id上的列表,项目加入list_id上的列表,目标是获取每个列的所有行数据。

我尝试了什么? 好吧,我实际上只能通过三个单独的查询/输出来完成它,然后用PHP迭代它们来组合数据。

是否可以编写查询,以便最终得到一个我可以轻松迭代的数据对象?

project (w details)
-- list (and its details)
----- item (w details)
----- item (w details)
----- item (w details)
-- list (w details)
----- item (w details)
----- item (w details)

2 个答案:

答案 0 :(得分:5)

你的意思是这样的:

select
    a.project_id,
    b.list_id,
    c.item_id
from
    projects a
        join lists b
            on a.project_id=b.project_id
        join items c
            on b.list_id=c.list_id

输出类似于:

project_id | list_id | item_id
 1         | 5       |  45
 1         | 5       |  46
 1         | 8       |  12

或者你想将它的所有部分归还一行吗?

如果您想要一行,您可以按照以下方式执行操作:

select
    a.project_id,
    group_concat(b.list_id) as listIDs,
    group_concat(c.item_id) as itemIDs
from
    projects a
        join lists b
            on a.project_id=b.project_id
        join items c
            on b.list_id=c.list_id

但是在PHP中处理所有分组的东西会变得更加混乱。

输出类似于:

project_id | list_id | item_id
 1         | 5,8     |  45, 46, 12

你也可以将两者混合搭配,以获得两全其美的效果:

select
    a.project_id,
    b.list_id as listIDs,
    group_concat(c.item_id) as itemIDs
from
    projects a
        join lists b
            on a.project_id=b.project_id
        join items c
            on b.list_id=c.list_id

输出类似于:

project_id | list_id | item_id
 1         | 5       |  45, 46
 1         | 8       |  12

答案 1 :(得分:1)

试试这个:如果你想显示投射方式

select
    a.project_id,
    b.list_id,
    c.item_id
from
    projects a
    left join lists b  on a.project_id=b.project_id
    left join items c  on b.list_id=c.list_id
    order by b,c