【问题标题】:How to show all records from one table even if they don't match WHERE clause with JOIN如何显示一个表中的所有记录,即使它们与 WHERE 子句与 JOIN 不匹配
【发布时间】:2013-02-25 23:32:34
【问题描述】:

我在尝试实现的咨询时遇到问题:

SELECT [columns] FROM table1 LEFT/RIGHT JOIN table2 ON table1.id_user = table2.id  [WHERE clause] GROUP BY column

我希望这个咨询做的一个例子如下所示:

在 table1 中有这些记录:

标识 | id_user |用户 ||价值

1 | 1    |名称1 | 10

2 | 1    |名称1 | 10

3 | 1    |名称1 | 11

4 | 1    |名称1 | 10

5 | 2    |名称2 | 11

6 | 2    |名称2 | 11

表 2 中的这些:

标识 |用户

1 |名字1

2 |名字2

我想获取给定值的每个用户存在多少条记录,例如,如果我们查找值 10 我想获取:

名称1 | 3

名称2 | 0

我已经尝试使用 LEFT 和 RIGHT JOIN 但没有用,我只是得到了这个,因为这是我猜想的唯一匹配 WHERE 子句的记录:

名称1 | 3

而不是 name2 的结果。

在将我的问题带到这里之前,我一直在寻找解决方案,但没有成功,希望有人可以帮助我解决这个问题:)

抱歉英语不好。 非常感谢您提供的任何帮助

【问题讨论】:

  • 表1中的id_user值与表2中的id列不匹配。为什么name2的id_user是1而不是2?
  • 对不起,这是我的错,刚刚修好了

标签: mysql join count


【解决方案1】:

不是最有效的查询,但这应该可以工作

select user, (select count(*) from table1 b where b.id_user=a.id and b.value=10)
from table2 a

通常,因为这个查询效率太低,我会在客户端加入结果,而不是尝试在 sql 中进行。这个过程会是这样的。

  1. 从表 2 中选择 *
  2. select id_user, count(*) from table1 where value=10
  3. 遍历查询 #1 并将结果存储在可能类似于 {'user': name, 'count': 0} 的对象中
  4. 遍历查询 #2 并更新步骤 #3 中的对象。

它总是取决于结果集的大小,可能还取决于所涉及的硬件,但通常这会更快,尽管在代码中编写起来相当复杂。

【讨论】:

  • 刚刚尝试了这个解决方案,它可以按我的意愿工作。谢谢!我也会尝试在客户端加入
【解决方案2】:

试试这个。

SELECT t2.user,SUM(CASE WHEN t2.id=t1.id_user THEN 1 ELSE 0 END) AS TotalRecords 
FROM table2 t2
LEFT JOIN table1 t1 ON t2.id =t1.id_user
GROUP BY t2.id 
HAVING t1.value=10

【讨论】:

  • 试过这个但是给了我同样的结果,只是name1的记录,我的实际查询是这样的:SELECT t2.queue AS "Queue", SUM(CASE WHEN t2.id=t1.id_queue THEN 1 ELSE 0 END) AS TotalRecords FROM queues t2 LEFT JOIN calls t1 ON t2.id = t1.id_queue WHERE t1.datetime_end BETWEEN '2013-02-21 00:00:00' AND '2013-02-21 23:59: 59' 按 t2.queue 分组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多