从一个表中获取数据并从另一个表中匹配记录数
问题描述:
我不确定这是否可能。我有一个表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
答
简单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将为未集合的列挑选随机的行值,这可能会造成问题。避免这种反模式。
谢谢。我刚刚尝试过,但它错误地将't.getter_id'计数为与't.giver_id'相同的值。我是否需要修改'ON'语句以允许在't.getter_id'和't.giver_id'列上进行计数? – freeworlder
你可以修改你的问题并提供预期输出的数据样本吗? –
已添加样本数据和预期输出。 – freeworlder