2

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

项目连接到 上的列表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)
4

2 回答 2

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
于 2012-08-04T06:47:16.113 回答
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
于 2012-08-04T06:50:53.167 回答