-1

我正在尝试计算未在另一个表中引用的用户...现在,我有一些类似的内容:

SELECT COUNT(DISTINCT u.id) FROM users u INNER JOIN orders o ON o.assigned!=u.id;

但是,它返回一个无效值。有什么建议么?

谢谢!

4

5 回答 5

2

我建议LEFT JOIN在两个表之间使用 a 并过滤表中没有匹配 id 的行orders

select count(u.id)
from users u
left join orders o
  on o.assigned = u.id
where o.assigned is null

请参阅带有演示的 SQL Fiddle

于 2013-04-09T20:28:13.037 回答
1

使用左连接并计算不匹配的行数:

SELECT COUNT(*)
FROM users u
LEFT JOIN orders o
ON o.assigned = u.id
WHERE o.assigned IS NULL

另一种方法是使用 NOT IN 检查:

SELECT COUNT(*)
FROM users
WHERE id NOT IN (SELECT distinct(assigned) FROM orders)

但是,根据我的经验,左连接的性能更好(假设有适当的索引)。

于 2013-04-09T20:28:22.887 回答
0
SELECT COUNT(1) FROM users u 
WHERE NOT EXISTS (SELECT * FROM orders o WHERE o.assigned=u.id);

您是想要直接计数(就像您提到的那样),还是需要返回值?这会给你计数;如果您想要其他值,则应采用上面列出的其他方法之一。

于 2013-04-09T20:29:33.120 回答
0

只需使用此查询,假设 id 在 users 表中是唯一的:

select count(*) From  Users as u where u.id not in (select assigned from orders)
于 2013-04-09T20:32:24.793 回答
0

内部联接显式查找匹配的行,因此如果您正在查找不匹配的记录,这不是可行的方法

假设 ORDERS.ASSIGNED 与 USER.ID 匹配,外部联接可以从两者返回值并显示何时没有匹配项

select u.id, o.* from users u full external join orders o on o.assigned = u.id;

如果您只想知道哪个 USER.ID 没有 ORDERS 记录,您也可以 INTERSECT 或使用 NOT IN () 例如

从用户 u 中选择 u.id,其中 id 不在(从 orders.o 中选择 o.assigned);

于 2013-04-09T20:34:11.867 回答