如果任何一行中的字段x有值y,则忽略mysql中的else group results by group by而不使用子查询

eivgtgni  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(215)

我有两张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

它可以通过子查询完成,但我的要求是使用单个查询而不使用子查询。
有办法吗?
谢谢!

a2mppw5e

a2mppw5e1#

你应该把成功的条件从 where 条款进入 join ... on 条款:

SELECT
    users.*,
    status.status
FROM
    users
LEFT JOIN
    status ON users.id = status.user_id AND status.status != "success"
WHERE
    users.admin_id = 10 
GROUP BY
    users.id

一个与您的问题无关的旁注:在您的问题中指定列对于sql来说是非标准的 select 既不按分组,也不在功能上依赖于分组表达式,也不聚合的子句。
因此,最好是以某种方式汇总状态(选择最适合您需要的: min , max , ...):

SELECT
    users.*,
    min(status.status) as status
FROM
    users
LEFT JOIN
    status ON users.id = status.user_id AND status.status != "success"
WHERE
    users.admin_id = 10 
GROUP BY
    users.id
lymnna71

lymnna712#

尝试下一个查询。我们首先按您在select子句上使用的users列进行分组,然后使用having子句来丢弃那些status=“success”计数大于零的组。

SELECT
    users.id,
    users.admin_id,
    users.name,
    MAX(status.status)
FROM
    users
LEFT JOIN
    status ON status.user_id = users.id
WHERE
    users.admin_id = 10
GROUP BY
    users.id, users.admin_id, users.name
HAVING
    SUM(CASE WHEN status.status = "success" THEN 1 ELSE 0 END) = 0

相关问题