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还为您添加了一个混合的行,数据冗余度较低,可以很好地分组。