2017-03-25 4 views
-1

私は2つのテーブル、ボードと投票を持っています。MySQL - LEFT JOINを2回使用するには?

create table board (
id int unsigned not null primary key auto_increment, 
type varchar(10) not null, 
article_id int unsigned, 
title varchar(255) not null, 
content text not null); 

create table vote (
no int unsigned not null primary key auto_increment, 
id int unsigned not null 
voter_email varchar(255)); 

ボードテーブルには、記事と返信の2種類のデータが格納され、返信タイプにはarticle_idがあります。
以下のクエリを使用して各記事の返信件数を数えます。

select b.id, b.title, b.content, b2.reply 
from board b left join 
(select article_id, count(id) as reply from board 
where article_id is not null group by article_id) 
b2 on b2.article_id = b.id; 

+----+-------+---------+-------+ 
| id | title | content | reply | 
+----+-------+---------+-------+ 
| 10 | uu | uuu  | NULL | 
| 12 | eee | eeee |  4 | 
+----+-------+---------+-------+ 

そして、以下のクエリを使用して各記事の投票数をカウントできます。

select id, count(*) as vote from vote group by id; 
+----+------+ 
| id | vote | 
+----+------+ 
| 12 | 1 | 
+----+------+ 

これで、2つの結果を1つにマージしようとしています。

どうすればいいですか?
私が期待した結果がこれです:

+----+-------+---------+-------+------+ 
| id | title | content | reply | vote | 
+----+-------+---------+-------+------+ 
| 10 | uu | uuu  | NULL | NULL | 
| 12 | eee | eeee |  4 | 1 | 
+----+-------+---------+-------+------+ 

答えて

-1

あなたはサブクエリを使用する代わりに、そのように参加することができます。

select b.id, 
     b.title, 
     b.content, 
     (select count(*) from board as b2 where article_id = b2.id) as reply, 
     (select count(*) from vote where id = b.id) as votes 
from board b ; 

votes.idに1つずつ注

board.article_idに、あなたはインデックスを追加する必要がありますパフォーマンスのあなたのシステムを維持するために:I私は今、私のコンピュータの近くにいないですので、あなたがそれを微調整する必要がある場合がありますので、このクエリをテストすることができていない;)

は、私はこれが役に立てば幸い:)

+0

@KimNR - **しない**使用しています相関サブクエリは完全に遅くなる傾向があります。 JOINベースのソリューションを使用します。 – GurV

+0

@ GurVジョインとサブクエリで高速かつ低速なシナリオを見てきましたが、私は通常、最も効果的なものを見つけるためにさまざまなソリューションをテストします。ジョインはこのシナリオでうまくいくかもしれませんが、おそらくMySQLのバージョンと使用されているエンジンにも依存しています。 – mkrmr

+0

@mkrmr見たものは何ですか?あなたの解決策に関するコメントが最適ではないということですか? SQLの世界では、シンプルに思えるかもしれませんが、あなたが望むほど効率的ではないかもしれません。相関クエリが高速である可能性があることを意味するならば、答えはそれほど頻繁ではありません。 – GurV

0

ちょうど別left joinん:

select b.id, b.title, b.content, b2.reply 
from board b 
left join (
    select article_id, count(id) as reply 
    from board 
    where article_id is not null 
    group by article_id) b2 on b2.article_id = b.id 
left join (
    select id, count(*) as vote 
    from vote 
    group by id) AS v on v.id = b.id 
1

は単に最後に別のleft joinを追加します。

select b.id, b.title, b.content, b2.reply, v.vote 
from board b 
left join (
    select article_id, count(id) as reply 
    from board 
    where article_id is not null 
    group by article_id 
    ) b2 on b2.article_id = b.id 
left join (
    select id, count(*) as vote 
    from vote 
    group by id 
    ) v on b.id = v.id; 
0

サンプルあなたに見て、あなたのスキーマ左結合とグループを使用する必要があります。

select b.id, b.title, b.content, b.reply, sum(v.vote) 
from board b 
left join vote on b.id = v.id 
group by b.id, b.title, b.content, b.reply 
関連する問題