1

私たちが知っているように、LEFT JOIN SQL ステートメントは、LEFT テーブルからのすべての値と、Right テーブルからの ID (外部キー) を介したジョイント値を提供します。たとえば、次の表があります

comments
    comment_id
    parent_id
    comment_body

このテーブルには次のデータがあります

-----------|-----------|-------------------|
comment_id | parent_id | comment_body      |
-----------|-----------|-------------------|
1          | NULL      | parent comment    | 
-----------|-----------|-------------------|
2          | 1         | child comment     | 
-----------|-----------|-------------------|
3          | NULL      | parent comment    | 
-----------|-----------|-------------------|
4          | 1         | child comment     | 
-----------|-----------|-------------------|
5          | 3         | child comment     | 
-----------|-----------|-------------------|
6          | 1         | parent comment    | 
-----------|-----------|-------------------|
7          | NULL      | parent comment    | 
-----------|-----------|-------------------|
8          | 1         | child comment     | 
-----------|-----------|-------------------|
9          | 7         | child comment     | 
-----------|-----------|-------------------|
10         | 3         | child comment     | 
-----------|-----------|-------------------|

たとえば、上記のテーブルで次のクエリを実行します

SELECT c1 . * , c2 . * 
FROM comments c1
LEFT JOIN comments c2 ON c2.parent_id = c1.comment_id
WHERE c1.parent_id IS NULL 

次の出力が得られます

-----------|-----------|---------------|------------|-----------|---------------|
comment_id | parent_id | comment_body  | comment_id | parent_id | comment_body  |
-----------|-----------|---------------|------------|-----------|---------------|
1          | NULL      |parent comment | 1          | 1         | child comment |
-----------|-----------|---------------|------------|-----------|---------------|
1          | NULL      |parent comment | 4          | 1         | child comment |
-----------|-----------|---------------|------------|-----------|---------------|
1          | NULL      |parent comment | 6          | 1         | child comment |
-----------|-----------|---------------|------------|-----------|---------------|
1          | NULL      |parent comment | 8          | 1         | child comment |
-----------|-----------|---------------|------------|-----------|---------------|
3          | NULL      |parent comment | 5          | 3         | child comment |
-----------|-----------|---------------|------------|-----------|---------------|
3          | NULL      |parent comment | 10         | 3         | child comment |
-----------|-----------|---------------|------------|-----------|---------------|
7          | NULL      |parent comment | 9          | 7         | child comment |
-----------|-----------|---------------|------------|-----------|---------------|

ここで値を強調表示しました。これは余分であり、必要ありません。

ここに画像の説明を入力

そして私の意見では、これらの追加の値はパフォーマンスに効果的である可能性があります。次の形式で出力を取得できますか

ここに画像の説明を入力

それが不可能な場合は、上記のクエリの長​​所と短所を教えてください。また、使用する必要がありますか?

4

3 に答える 3

0

さらにいくつかのサブクエリの例を使用することもできます。

SELECT 
    IF(c2.comment_id = c4.first_child, c1.comment_id, NULL) AS comment_id,
    IF(c2.comment_id = c4.first_child, c1.parent_id, NULL) AS parent_id,
    IF(c2.comment_id = c4.first_child, c1.comment_body, NULL) AS comment_body,
   c2.*
FROM comments c1
LEFT JOIN comments c2 ON c2.parent_id = c1.comment_id
LEFT JOIN ( select c3.parent_id, MIN(c3.comment_id) AS first_child from comments as c3 WHERE c3.parent_id IS NOT NULL GROUP BY c3.parent_id ) as c4 ON (c4.parent_id = c2.parent_id)
WHERE c1.parent_id IS NULL;

出力例:

comment_id | parent_id | comment_body   | comment_id | parent_id | comment_body
1          | NULL      | Parent Comment | 2          | 1         | Child Comment
NULL       | NULL      | NULL           | 4          | 1         | Child Comment
NULL       | NULL      | NULL           | 6          | 1         | Child Comment
NULL       | NULL      | NULL           | 8          | 1         | Child Comment
3          | NULL      | Parent Comment | 5          | 3         | Child Comment
NULL       | NULL      | NULL           | 10         | 3         | Child Comment
7          | NULL      | Parent Comment | 9          | 7         | Child Comment

もちろん、パフォーマンスが必要な場合は、そのようなことは役に立ちません。クエリが速くなるわけではありません。

タグ PHP をすべてマークしており、CPU/メモリの使用量が少なく、帯域幅が少ない (mysql サーバーが localhost にない場合) クイッククエリを実行したい場合。次に、おそらく最も賢明な方法は、いくつかのクエリを作成し、テーブルが大きい場合に、mysql から本当に必要なものだけを確認することです。おそらく、すべての親と子のコメントを一度に取得したくないでしょう。そして、あなたの子のコメントが他のコメントの親でもある場合、あなたはどうしますか ;-)

于 2013-04-11T09:12:33.907 に答える