2

ネストされたクエリを使用することは良い考えではないことを読みました.ネストされたクエリはmysqlを大幅に遅くすると言われているので、ネストされたクエリを使用しないでください.

たとえば、最高評価のコメントを一番上に表示するコメント評価システムがあり、2 つのテーブルに表示されます。

commentsコメント
comment_ratingsを保存する コメントIDとそれを評価した人を保存する

: 肯定的な評価しかないため、comment_ratingsテーブルにレコードが存在する場合は +1 になります。

だから今、何かのコメントを拾いたいのなら、

SELECT stuff, (SELECT COUNT(*) FROM comment_ratings s WHERE s.id = c.id) as votes
FROM comments c
ORDER BY votes DESC

ネストされたクエリを使用せずにこれを行うにはどうすればよいですか?

4

2 に答える 2

2

ネストされたクエリが良いか悪いかは、状況によって異なります。あなたの特定の例では、にインデックスがある場合、comment_ratings(id)おそらく問題はありません。おそらくそうあるべきでしょうcomment_ratings(comment_id)-- これらのテーブルの命名規則は貧弱です。

これを集計クエリに置き換えることができます。

select c.*, count(cr.id) as votes
from comments c left join
     comment_ratings cr
     on c.id = cr.id
group by c.id
order by votes desc;

ただし、MySQL が を実装する方法が原因でgroup by、これは元のクエリよりもパフォーマンスが低下する可能性があります。のほうが好きgroup byです。私には、それはあなたが望むものをより明確に記述しており、他のほとんどのデータベースエンジンはそれをうまく最適化します.

于 2013-09-10T21:00:10.827 に答える
1
select stuff, count(*) as votes
from comments c, comment_ratings cr
where c.id = cr.id
group by stuff
order by votes desc; 

ゴードンが述べたように、評価のないコメントを忘れないように..左結合に進みます:

select stuff, count(cr.id) as votes
from comments c left join 
     comment_ratings cr on c.id = cr.id
group by stuff
order by votes desc;

http://sqlfiddle.com/#!2/79e54/2

于 2013-09-10T20:59:52.550 に答える