失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > mysql两张表一起计数_mysql-同一张表上的多个联接 其中一个查询计数

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

时间:2019-05-30 03:13:39

相关推荐

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/1028/1950363.html

如果觉得《mysql两张表一起计数_mysql-同一张表上的多个联接 其中一个查询计数》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。