2 COUNT inside a SELECT with LEFT JOIN
2 COUNT inside a SELECT with LEFT JOIN
我有 2 个 table:
用户:
ID | NAME
1 | caio
2 | mike
3 | peter
发送:
ID | ID_SEND | ID_RECEIVE
1 | 1 | 2
2 | 2 | 3
3 | 3 | 2
4 | 2 | 1
每次用户向另一个用户发送卡片(通过电子邮件发送)时,都会提供 table。
问题:我想写一个SELECT
知道用户进入了多少次ID_SEND
,用户进入了多少次ID_RECEIVE
。我试过这样的事情:
SELECT
user.email,
COUNT(sends.id_receive) AS numberReceive,
COUNT(sends.id_send) AS numberSend
FROM
user
LEFT JOIN
sends ON user.id = sends.id_send OR user.id = sends.id_receive
GROUP BY
user.email
问题是 ID_SEND
和 ID_RECEIVE
都返回相同的值,两者的总和...我哪里出错了?
LEFT JOIN
两次,一次发送,一次接收
SELECT u.email,
COUNT(r.id_receive) AS numberReceive,
COUNT(s.id_send) AS numberSend
FROM user u
LEFT JOIN sends r ON u.id = r.id_receive
LEFT JOIN sends s ON u.id = s.id_send
GROUP BY u.email
或者,单个 LEFT JOIN
,使用 case 表达式的条件计数:
SELECT u.email,
SUM(case when u.id = s.id_receive then 1 else 0 end) AS numberReceive,
SUM(case when u.id = s.id_send then 1 else 0 end) AS numberSend
FROM user u
LEFT JOIN sends s ON u.id IN (s.id_receive, s.id_send)
GROUP BY u.email
试试这个。
SELECT S.*,
R.received
FROM (SELECT u.NAME,
Count(snd.id) sends
FROM USER u
JOIN sends snd
ON snd.id_send = u.id
GROUP BY u.NAME) S
LEFT JOIN (SELECT u.NAME,
Count(rec.id) received
FROM USER u
JOIN sends rec
ON rec.id_receive = u.id
GROUP BY u.NAME) R
ON S.NAME = R.NAME
我有 2 个 table:
用户:
ID | NAME
1 | caio
2 | mike
3 | peter
发送:
ID | ID_SEND | ID_RECEIVE
1 | 1 | 2
2 | 2 | 3
3 | 3 | 2
4 | 2 | 1
每次用户向另一个用户发送卡片(通过电子邮件发送)时,都会提供 table。
问题:我想写一个SELECT
知道用户进入了多少次ID_SEND
,用户进入了多少次ID_RECEIVE
。我试过这样的事情:
SELECT
user.email,
COUNT(sends.id_receive) AS numberReceive,
COUNT(sends.id_send) AS numberSend
FROM
user
LEFT JOIN
sends ON user.id = sends.id_send OR user.id = sends.id_receive
GROUP BY
user.email
问题是 ID_SEND
和 ID_RECEIVE
都返回相同的值,两者的总和...我哪里出错了?
LEFT JOIN
两次,一次发送,一次接收
SELECT u.email,
COUNT(r.id_receive) AS numberReceive,
COUNT(s.id_send) AS numberSend
FROM user u
LEFT JOIN sends r ON u.id = r.id_receive
LEFT JOIN sends s ON u.id = s.id_send
GROUP BY u.email
或者,单个 LEFT JOIN
,使用 case 表达式的条件计数:
SELECT u.email,
SUM(case when u.id = s.id_receive then 1 else 0 end) AS numberReceive,
SUM(case when u.id = s.id_send then 1 else 0 end) AS numberSend
FROM user u
LEFT JOIN sends s ON u.id IN (s.id_receive, s.id_send)
GROUP BY u.email
试试这个。
SELECT S.*,
R.received
FROM (SELECT u.NAME,
Count(snd.id) sends
FROM USER u
JOIN sends snd
ON snd.id_send = u.id
GROUP BY u.NAME) S
LEFT JOIN (SELECT u.NAME,
Count(rec.id) received
FROM USER u
JOIN sends rec
ON rec.id_receive = u.id
GROUP BY u.NAME) R
ON S.NAME = R.NAME