【问题标题】:2 COUNT inside a SELECT with LEFT JOIN2 COUNT 在带有 LEFT JOIN 的 SELECT 内
【发布时间】:2016-03-09 20:28:39
【问题描述】:

我有 2 张桌子:

用户:

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

每次用户向另一位用户发送卡片(通过电子邮件发送)时,都会为餐桌提供信息。

问题:我想写一个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_SENDID_RECEIVE 都返回相同的值,两者的总和......我哪里出错了?

【问题讨论】:

    标签: mysql select sum left-join


    【解决方案1】:

    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
    

    【讨论】:

    • with 2 LEFT JOIN 我有一个错误:mysql_fetch_array() 期望参数 1 是资源
    • 这很奇怪......应该可以正常执行。我将添加一个替代解决方案。 5. 回来查看。
    • 是否可以将 numberReceive 和 numberSend 相加来进行 ORDER BY?
    • 你可以做ORDER BY numberReceive + numberSend
    【解决方案2】:

    试试这个。

    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 
    

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      相关资源
      最近更新 更多