SQL - 选择在不同表中具有最大非空行数的userid

时间:2012-10-24 15:33:16

标签: mysql sql oracle

我有3张桌子说A,B,C。

表A有userid列 表B有caid列 表C包含lisidimage列。

一个userid可以有一个或多个caid s 一个caid可以有一个或多个lisid s。

如何选择userid,其image列的最大行数为not null(在某些lisid s image列中为空在一些它有一些价值)。

有人可以帮忙。

1 个答案:

答案 0 :(得分: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。

获取具有最大值的所有行需要更多的工作。基本上,您必须加入上述查询才能获得列表

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不提供这些。