Php 连接三个表的MySQL查询

Php 连接三个表的MySQL查询,php,mysql,database,Php,Mysql,Database,我有三个表:项目、列表和项目 项目连接到project\u id上的列表,项目连接到list\u id上的列表,目标是获得每个项目的所有行数据 我试过什么? 实际上,我只能通过三个独立的查询/输出,然后用PHP迭代它们来组合数据 是否可以编写查询,这样我就可以得到一个可以轻松迭代的数据对象 project (w details) -- list (and its details) ----- item (w details) ----- item (w details) ----- item (

我有三个表:项目、列表和项目

项目连接到
project\u id
上的列表,项目连接到
list\u 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)
你的意思是这样的:

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
project_id | list_id | item_id
 1         | 5,8     |  45, 46, 12
project_id | list_id | item_id
 1         | 5       |  45, 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       |  45
 1         | 5       |  46
 1         | 8       |  12
project_id | list_id | item_id
 1         | 5,8     |  45, 46, 12
project_id | list_id | item_id
 1         | 5       |  45, 46
 1         | 8       |  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
 1         | 5       |  46
 1         | 8       |  12
project_id | list_id | item_id
 1         | 5,8     |  45, 46, 12
project_id | list_id | item_id
 1         | 5       |  45, 46
 1         | 8       |  12

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

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

嗯,是的,我想是的。我希望能够将所有这些数据发送到视图中。@Kristian不,一行中的冗余数据会更少,但您必须在PHP中进行更多的操作,才能再次将它们分离出来。我在想类似于
group\u concat()
之类的东西,比如把所有的东西放在一起。谢谢你,伙计。好的,我刚刚更新了我的问题,在得到两个回答后,我意识到我应该说,我希望每一个都是整行的。但我认为,当行与键名不匹配时,这是不可能的,对吗?@Kristian还为您添加了一个混合的行,数据冗余度较低,可以很好地分组。