0

私は3つのテーブルがA、B、Cと言っています。

表Aにはuserid列があります。
表Bにはcaid列があります。
表Cにはlisidimage列があります。

1useridつまたは複数caidのsを持つことができます。
1caidつまたは複数lisidのsを持つことができます。

userid列が最大の行数を持つを選択するにはどうすればよいですか(一部のimage列は空白で、一部の列には値があります)。not nulllisidimage

誰か助けてくれませんか。

4

1 に答える 1

0

おそらく、IDは合理的な方法でテーブル間で分散されます。もしそうなら、以下はこれを行う必要があります:

select b.userid, count(*)
from TableB b join
     TableC c
     on b.caid = c.caid
where c.image is not null
group by b.userid
order by count(*) desc
limit 1

コメントの質問は、TableAをTableBに接続し、TableBをTableCに接続する方法です。合理的なアプローチは、TableBにuseridを、TableCにcaidを含めることです。

maxですべての行を取得するには、もう少し作業が必要です。基本的に、リストを取得するには、上記のクエリに参加する必要があります

select s.*
from (select b.userid, count(*) as cnt
      from TableB b join
           TableC c
           on b.caid = c.caid
     ) s
     (select count(*) as maxcnt
      from TableB b join
           TableC c
           on b.caid = c.caid
      group by b.userid
      order by count(*) desc
      limit 1
     ) smax
     on s.cnt = smax.cnt

他のデータベースには、この種のクエリをはるかに簡単にするウィンドウ関数/ランキング関数と呼ばれる一連の関数があります。残念ながら、MySQLはこれらを提供していません。

于 2012-10-24T15:38:43.470 に答える