2011-01-25 8 views
1

私は次のシナリオを持っている:mysql大きなデータセットまたはループのIN?

Table 1: 

articles 

id article_text category author_id 
1 "hello world" 4    1 
2 "hi"    5    2 
3 "wasup"   4    3 


Table 2 

authors 

id name  friends_with 
1 "Joe"  "Bob" 
2 "Sue"  "Joe" 
3 "Fred"  "Bob" 

私は、特定のカテゴリの「ボブ」と友達である著者の総数を知りたいです。

たとえば、カテゴリ4の場合、「Bob」の友達である著者がいくつあるのですか。

authorsテーブルがいくつかのケースでは、私は「ボブ」と友達である万人作家を持って、非常に大きいです

だから私は試してみました:ボブと友達である著者の

のGetリストを、そしてそれらをループして、与えられたカテゴリのそれらのそれぞれのためのカウントを取得し、私のコードでそれらをまとめてください。

このアプローチの問題は、非常に高速であるにもかかわらず、100万のクエリを生成できるということです。より良い方法があるはずです。

私はbobの友達である著者のリストを取得しようと考えていましたが、そのリストでIN句を作成しましたが、クエリセットで許可されているメモリの量を吹き飛ばす恐れがあります。

よくある問題です。何か案は?記事は、著者ごとに複数の行を打つ可能性があるとして

おかげ

+0

私は実際のサンプルがわかりませんが、関係の友情は多くの人にあり、あなたはそのデータを別々のテーブルに保管するべきだと思います。 – adopilot

答えて

1
SELECT COUNT(DISTINCT auth.id) 
FROM authors auth 
INNER JOIN articles art ON auth.id = art.author_id 
WHERE friends_with = 'bob' AND art.category = 4 

カウント(個別a.id)が必要です。

あなたがデータベースを支配しているなら、私はfriends_withのリンクテーブルをあなたのcussrentソリューションとして使用するか、カンマ区切りの名前リストを使用する必要があります。これはパフォーマンス上悲惨であり、友人は1人しかいない。

友達

ID friend_id

その後、クエリは、この

SELECT COUNT(DISTINCT auth.id) 
FROM authors auth 
INNER JOIN articles art ON auth.id = art.author_id 
INNER JOIN friends f ON auth.id = f.id 
INNER JOIN authors fauth ON fauth.id = f.friend_id 
WHERE fauth.name = 'bob' AND art.category = 4 

そのより複雑なように見えるだろうが、ちょうど思い出してくれる、これは友人で2行のための呼び出しを構築し、多くの友人を可能にしますジョーからボブへの1つ、ボブからジョーへの1つずつ。

これを別の方法でビルドすることはできますが、クエリをさらに複雑にすることになります。

+0

Count(DISTINCT id) – Harish

0

たぶん

select fr.name, 
     fr.id, 
     au.name, 
     ar.article_text, 
     ar.category, 
     ar.author_id 
from authors fr, authors au, articles ar 
where fr.id = ar.author_id 
and au.friends_with = fr.name 
and ar.category = 4 ; 

のようなものは使用しないだけで、カウント...

select count(distinct fr.name) 
from authors fr, authors au, articles ar 
where fr.id = ar.author_id 
and au.friends_with = fr.name 
and ar.category = 4 ; 
0

バージョンがうまくいけば動作します(参加します!friends_with = 'ボブとidでは(カテゴリ= 4)

記事からAUTHOR_IDを選択する著者から)

SELECT COUNT(個別のIDが)私はの 'IN' として文を理解することが容易であるました私はSQLを使い始めました。

関連する問題