2

プロジェクト、リスト、アイテムの 3 つのテーブルがあります。

プロジェクトは のリストにproject_id結合し、アイテムは のリストに結合しますlist_id。目標は、それぞれのすべての行データを取得することです。

私は何を試しましたか? まあ、私は実際には、3 つの個別のクエリ/出力を用意し、PHP でそれらを繰り返し処理してデータを結合することによってのみ、それを行うことができました。

簡単に繰り返し処理できる 1 つのデータ オブジェクトになるようなクエリを作成することはできますか?

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

それとも、すべての部分を 1 行で返したいですか?

単一の行が必要な場合は、次の行に沿って何かを行うことができます。

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

この 2 つを組み合わせて、両方の長所を活かすこともできます。

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 に答える