我不确定这是否可行。我有一个表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
答案 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将为未聚合的列选取随机行值,这可能会有问题。避免这种反模式。