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

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

问题描述:

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

+0

谢谢。我刚刚尝试过,但它错误地将't.getter_id'计数为与't.giver_id'相同的值。我是否需要修改'ON'语句以允许在't.getter_id'和't.giver_id'列上进行计数? – freeworlder

+0

你可以修改你的问题并提供预期输出的数据样本吗? –

+0

已添加样本数据和预期输出。 – freeworlder