从一个表中获取数据并计算另一个表中的匹配记录

时间:2017-05-31 21:34:46

标签: mysql select join count

我不确定这是否可行。我有一个表members和第二个表transactions

我需要从members表中获取成员的名称,但还要计算成员从另一个表中创建的事务数。这在JOIN语句中是否可行,或者我是否需要编写两个语句?

SELECT
    m.first_name,
    m.last_name,
    COUNT(t.giver_id),
    COUNT(t.getter_id)
FROM
    members AS m
JOIN
    transactions AS t
ON
    m.id = t.giver_id
WHERE
    m.id = $i

我应该补充说,成员可能没有进行任何交易,因此不会出现在transactions表中。

当我运行此代码时,它会返回所有NULL列。当我添加EXPLAIN语句时,MySql说“读取const表后不可能注意到了......”

这可能吗?如果是这样,那么我做错了什么?提前谢谢。

编辑: 样本数据结构和预期输出:

members
id  |  first_name  |  last_name
_______________________________
1   |     Bill     |    Smith
2   |     Joe      |    Jones

transactions table
id  |  giver_id  |  getter_id  |  status
________________________________________
1   |      1     |      2      |  complete
2   |      1     |      2      |  complete

因此运行我的查询应返回:

1   |   Bill   |   Smith   |   2   |   0
2   |   Joe    |   Jones   |   0   |   2

1 个答案:

答案 0 :(得分:1)

简单的LEFT JOIN就足够了:

SELECT
  m.first_name,
  m.last_name,
  SUM(CASE WHEN m.id = t.giver_id THEN 1 END) AS giver_count,
  SUM(CASE WHEN m.id = t.getter_id THEN 1 END) AS getter_count
FROM members AS m
LEFT JOIN transactions AS t ON m.id = t.giver_id OR m.id = t.getter_id
GROUP BY m.first_name, m.last_name

使用聚合函数时不要忘记添加GROUP BY。仅仅因为MySQL允许查询在没有它的情况下通过,它并不意味着它被建议。 MySQL将为未聚合的列选取随机行值,这可能会有问题。避免这种反模式。