mysql两张表一起计数_mysql-同一张表上的多个联接,其中一个查询计数

我有一个关于SQL查询的基本问题,即两次将同一张表连接在一起.听起来很简单,但是我有一些麻烦.我希望任何人都可以帮助我解决这个问题:)

我有两个小表:“人民”(列:id,姓名,…)和“喜欢”(id,谁,谁).人们可以彼此设置“喜欢”.这种关系是多对多的.

我想得到人们喜欢的桌子:收到的“喜欢”的数量,传递的数量和相互喜欢的数量.

当我仅使用一个联接时,一切都正确.但是对于两个联接(或更多联接),MySQL组合了所有行(如预期的那样),并且计数得到错误的值.我不知道在这种情况下如何必须使用count / sum / group-by运算符:(我想在一个查询中没有子查询的情况下执行此操作.

我使用了这样的查询:

SELECT *, count(l1.whom), count(l2.whom)

FROM people p

LEFT JOIN likes l1 ON l1.who = p.id

LEFT JOIN likes l2 ON l2.whom = p.id

GROUP BY p.id;

SELECT p.id, name,

count(lwho.who) delivered_likes,

count(lwhom.whom) received_likes,

count(lmut.who) mutual_likes

FROM people AS p

LEFT JOIN likes AS lwho ON p.id = lwho.who

LEFT JOIN likes AS lwhom ON lwhom.id = lwho.id

LEFT JOIN likes AS lmut ON lwhom.who = lmut.whom AND lwhom.whom = lmut.who

GROUP BY p.id;

但这是计算出的“不喜欢”次数.

仅出于培训和性能的问题并不重要,但是我想我的上一个查询中的三个联接太多了.我可以使用2个联接吗?

在此先感谢您的帮助.

解决方法:

我猜想,人与喜欢之间存在1:N的关系.

据我所知,第二个查询的一个问题是喜欢的lwhom相关性是通过id = id加入lwho的.基本上lwhom是lwho.我建议将此关联的ON子句从lwhom.id = lwho.id更改为p.id = lwhom.whom.

但是,计数仍将受JOIN的影响.但是,假设您在Likes表中有一个ID列,则可以让每个COUNT计数每个人的不同Like ID –如果没有,请考虑仅使用COUNT(DISTINCTcorrelation.*).

除了题外话,以下应该有望工作:

SELECT p.id, name,

count(distinct lwho.id) delivered_likes,

count(distinct lwhom.id) received_likes,

count(distinct lmut.id) mutual_likes

FROM people AS p

LEFT JOIN likes AS lwho ON p.id = lwho.who

LEFT JOIN likes AS lwhom ON p.id = lwhom.whom

LEFT JOIN likes AS lmut ON lwhom.who = lmut.whom AND lwhom.whom = lmut.who

GROUP BY p.id,p.name;

我有一个SQL Fiddle here.

标签:join,count,sql,mysql,group-by

来源: https://codeday.me/bug/20191028/1950363.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值