首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL Join -计数另一个表上的匹配项

MySQL Join -计数另一个表上的匹配项
EN

Stack Overflow用户
提问于 2012-07-03 15:28:24
回答 2查看 571关注 0票数 0

我有这样的疑问:

代码语言:javascript
复制
SELECT a.*, b.id AS host_id, COUNT(c.event_id) AS count_joins, COUNT(d.event_id) AS joined
FROM (`events` AS a)
INNER JOIN `users` AS b ON `b`.`id` = `a`.`host_id`
LEFT JOIN `joins` AS c ON `c`.`event_id` = `a`.`id`
LEFT JOIN `joins` AS d ON `d`.`event_id` = `a`.`id` AND d.user_id = 1
WHERE `a`.`date` > '1000-10-10 10:10:10'
GROUP BY `a`.`id`
ORDER BY `a`.`date` ASC
LIMIT 20

它获取所有事件、作者、加入的次数,并检查当前用户(id = 1)是否加入了该事件。

我在检查用户是否加入事件时遇到问题,它返回加入的次数,如果用户加入,则返回1,否则返回0。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 16:46:50

试试这个:

代码语言:javascript
复制
SELECT a.*, b.id AS host_id, 
SUM(CASE WHEN c.event_id IS NOT NULL THEN 1 ELSE 0 END) AS count_joins, 
SUM(CASE WHEN c.event_id IS NOT NULL AND c.user_id = 1 THEN 1 ELSE 0 END) AS joined
FROM (`events` AS a)
INNER JOIN `users` AS b ON `b`.`id` = `a`.`host_id`
LEFT JOIN `joins` AS c ON `c`.`event_id` = `a`.`id`
WHERE `a`.`date` > '1000-10-10 10:10:10'
GROUP BY `a`.`id`
ORDER BY `a`.`date` ASC
LIMIT 20
票数 0
EN

Stack Overflow用户

发布于 2012-07-03 15:45:34

我认为问题是你同时加入了a,b,c和d。因此,每次任何人加入每个事件(a×c)时都会得到一条记录,然后加入用户编号1的记录((a×c)×d)。因此,如果这些表看起来像

事件:{ e1,e2 }加入:{( e1,u1 ),( e1,u2 ),( e1,u3 ),( e2,u2 ),( e2,u4 )}

您的查询(在聚合函数之前)返回

{( e1,u1,u1 ),( e1,u2,u1 ),( e1,u3,u1 ),( e2,u2,null ),( e2,u4,null )}

你可能会得到你想要的东西

select子句在a×c上执行聚合,然后连接回"joins as d“table

  • including "c”上的合成域,比如c.user_id == 1 as is_user_1,然后在select子句max( is_user_1 )

中获取max( is_user_1 )

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11306336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档