我有两张table:
用户
id | admin_id | name
-----------------------
1 | 10 | a
2 | 10 | b
3 | 15 | c
4 | 10 | d
5 | 10 | e
6 | 10 | f
地位
id | user_id | status
-----------------------
1 | 2 | error
2 | 2 | success
3 | 2 | error
4 | 4 | success
5 | 6 | error
现在,我试图通过使用GROUPBY子句来获取admin\ ID10中没有任何表状态项的所有用户以及状态表中没有任何状态为success的项的用户。我的预期结果是:
结果:
id | admin_id | name | status
------------------------------------
1 | 10 | a | null
5 | 10 | e | null
6 | 10 | f | error
因此,根据预期的结果,查询应该忽略用户\ id 2,4,因为这两个在状态表中有success status。现在我试着这样做:
SELECT
users.*,
status.status
FROM
users
LEFT JOIN
status ON users.id = status.user_id
WHERE
users.admin_id = 10 AND status.status != "success"
GROUP BY
users.id
它可以通过子查询完成,但我的要求是使用单个查询而不使用子查询。
有办法吗?
谢谢!
2条答案
按热度按时间a2mppw5e1#
你应该把成功的条件从
where
条款进入join ... on
条款:一个与您的问题无关的旁注:在您的问题中指定列对于sql来说是非标准的
select
既不按分组,也不在功能上依赖于分组表达式,也不聚合的子句。因此,最好是以某种方式汇总状态(选择最适合您需要的:
min
,max
, ...):lymnna712#
尝试下一个查询。我们首先按您在select子句上使用的users列进行分组,然后使用having子句来丢弃那些status=“success”计数大于零的组。