我正在尝试计算未在另一个表中引用的用户...现在,我有一些类似的内容:
SELECT COUNT(DISTINCT u.id) FROM users u INNER JOIN orders o ON o.assigned!=u.id;
但是,它返回一个无效值。有什么建议么?
谢谢!
我建议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
使用左连接并计算不匹配的行数:
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)
但是,根据我的经验,左连接的性能更好(假设有适当的索引)。
SELECT COUNT(1) FROM users u
WHERE NOT EXISTS (SELECT * FROM orders o WHERE o.assigned=u.id);
您是想要直接计数(就像您提到的那样),还是需要返回值?这会给你计数;如果您想要其他值,则应采用上面列出的其他方法之一。
只需使用此查询,假设 id 在 users 表中是唯一的:
select count(*) From Users as u where u.id not in (select assigned from orders)
内部联接显式查找匹配的行,因此如果您正在查找不匹配的记录,这不是可行的方法
假设 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);