1

アイテムを注文してカウントするより多くのテーブル (4+) 間で複雑な SELECT を実行したいと考えています。

これまでのところ、これは私の行です:

SELECT
  myl_u.id, 
  myl_u.label_real_address, 
  myl_u.ext, 
  COUNT(myc_c.contact_id), 
  COUNT(myl_r_c.release_id) 
FROM
  myl_users myl_u  
  LEFT JOIN myc_contacts myc_c  ON myc_c.contact_type='l' AND myc_c.contact_id=myl_u.id 
  LEFT JOIN myl_releases myl_r ON myl_r.id=myl_u.id 
  LEFT JOIN myl_r_comments myl_r_c ON myl_r.release_id=myl_r_c.release_id 
GROUP BY myl_u.label_real_address 
ORDER BY COUNT(myc_c.contact_id) DESC

半分は機能していますが、SQL の後半部分を追加すると、予期しない値が表示され、それもなぜか 2 倍になります。

基本的に、私はmyl_users ( レコードラベルのコレクション) を 持ってい ます通常のユーザーがこれらのリリースに対して行ったコメントが含まれています。

レコード レーベルのお気に入りの数 (15、14、10、8..) で注文することができました - COUNT(myc_c.contact_id) 句

しかし、次の句を追加してクエリを大きくして、ラベルからのリリースにあるコメントの合計で並べ替えると、予期しないものが表示されます。

誰かが私を正しい方法で特定できますか?

私はコメントし、あなたのニーズに合わせて質問を調整/明確にします.

ありがとう、良いお年をお迎えください

4

2 に答える 2

1

問題は、複数の次元に沿って合計しているため、外積が得られていることです。最良の方法は、各次元に沿って個別に要約することです。

SELECT myl_u.id, myl_u.label_real_address, myl_u.ext, 
       sum(myc_c.cnt), 
       sum(myl_rc.cnt) 
FROM myl_users myl_u LEFT JOIN
     (select contact_id, count(*) as cnt
      from myc_contacts myc_c
      where myc_c.contact_type='l'
      group by contact_id
     ) myc_c
     ON myc_c.contact_id=myl_u.id LEFT JOIN
     (select myl_r.id, count(*) as cnt
      from myl_releases myl_r LEFT JOIN
           myl_r_comments myl_r_c
           ON myl_r.release_id=myl_r_c.release_id
      gropu by myl_r.id
     ) myl_rc
     ON myl_rc.id=myl_u.id 
GROUP BY myl_u.id, myl_u.label_real_address, myl_u.ext
ORDER BY 4 DESC

group byファイナルが必要かどうかは質問から明らかではありません。myl_u テーブルに重複がない場合、外部集計はまったく必要ありません。

于 2012-12-30T18:19:48.187 に答える