0

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

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

一个userid可以有一个或几个caids。
一个caid可以有一个或几个lisids。

如何选择一个userid具有最大行数的imagenot null(在某些lisidsimage列中为空白,在某些中它具有某些值)。

有人可以帮忙吗?

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。

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

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 回答