2
Table: A                  Table: B                 Table: C
------------            ----------------          -------------
P_id | G_id              P_id  |  Name            G_id | Title
------------            ----------------          -------------
 1   |  1                 1    | john              1   | php
 2   |  1                 2    | jack              2   | sql
 3   |  2                 3    | sam

今、私は次のように質問しています:

Select B.name, C.title
from B inner join A on...
inner join c on...

ここに john と入力すると、次のように表示されます。

john php.

しかし、私はそれを次のように表示したい:

john jack  php.   

john と jack の G_id が同じだからです。
これどうやってするの?

4

2 に答える 2

1

疑似コード (mysql に類似):

SELECT B.name, C.title 
FROM B
INNER JOIN A ON A.P_id = B.P_id
INNER JOIN C ON A.G_id = C.G_id
WHERE A.G_id = (
                 SELECT A.G_id 
                 FROM B
                 INNER JOIN A ON A.P_id = B.P_id
                 WHERE B.Name LIKE '%John%' LIMIT 1
               );

編集:

これにより、結果を名前で検索できるようになり、 Everton Agner が提案するようにGROUP_CONCATと GROUP BY を使用して、結果を正しくフォーマットします。

于 2011-08-19T10:38:24.610 に答える
1

この種のグループ化を処理するには、集約関数が必要です。私は MySQL に堪能ではありませんが、group_concat() 関数を使用して、このようなことを試してみてください。

select
    group_concat(b.Name),
    c.Title
from
    A a
    join B b on b.P_id = a.P_id
    join C c on c.G_id = a.G_id
group by
    c.Title

「ジョン、ジャック」が表示されることを願っています

ここで集計関数に関するドキュメントを確認してください: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

- 編集

テストしたところ、次の出力が得られました。

+----------------------+-------+
| group_concat(b.Name) | Title |
+----------------------+-------+
| john,jack            | php   |
| sam                  | sql   |
+----------------------+-------+

私はあなたが望むものであることを願っています:)

-- 編集 (最後のもの)

追加するだけで、含まれhaving group_concat(b.Name) like '%john%'ているグループのみが得られますjohn...より良い選択はarray contains関数ですが、見つかりませんでした。

+----------------------+-------+
| group_concat(b.Name) | Title |
+----------------------+-------+
| john,jack            | php   |
+----------------------+-------+
于 2011-08-19T11:22:29.700 に答える