【问题标题】:Mysql select distinct if column equal to otherwise dont select如果列等于,Mysql 选择不同的,否则不选择
【发布时间】:2015-10-01 13:45:11
【问题描述】:

我有一张这样的桌子:

   id | id_user | approved 
   -----------------
   1  | 15      | 1
   2  | 11      | 1
   3  | 15      | 1
   4  | 11      | -1
   5  | 6       | 1

只有当每个 id_users 的每个批准都等于 1 时,我才想选择 id_user 的不同值。 输出:

   id | id_user | approved 
   -----------------
   1  | 15      | 1
   2  | 6       | 1

如您所见,id_user 11 未被选中,因为一个已批准的值等于 -1。我如何在 mysql 中做到这一点?

我试过SELECT * FROM table WHERE approved != -1 GROUP BY id_user,但显然它不起作用,所以我决定在这里问这个问题。

非常感谢您的宝贵时间。

//稍后编辑

我还有一个问题。我必须修改查询。我还有一张桌子 validation

id | id_user | valid
--------------------
1  | 15      | 1

我必须加入另一个表,但有一个条件。例如,假设您的查询输出(正确):

id | id_user | approved 
-----------------
1  | 15      | 1
2  | 6       | 1

我想要加入这两个表:

LEFT JOIN (SELECT va.id_user,va.valid FROM validation va WHERE va.valid != 1) t2 
ON t2.id_user = t1.id_user

但仅选择有效不等于 1 的那些行。validation 表中可能不存在第一个表中的 id_user。在这种情况下,查询应该准确返回 Alex 的查询输出。

让我举个例子。第一张表是一样的:

 id | id_user | approved 
 -----------------
 1  | 15      | 1
 2  | 11      | 1
 3  | 15      | 1
 4  | 11      | -1
 5  | 6       | 1
 6  | 6       | 1

validation表:

 id | id_user | valid
 --------------------
 1  | 15      | 1

查询应该输出:

 id | id_user 
 ------------
 1  | 6

id_user = 15 与valid=1 在第二张表中,因此不会被选中

id_user = 11 在已批准字段中的值为 -1,因此不会被选中

id_user = 6 在两个已批准的字段中都有 1,但在第二个表中不存在,我希望它被选中。

【问题讨论】:

    标签: mysql select distinct


    【解决方案1】:

    这是我的方法: http://sqlfiddle.com/#!9/607e16/2

    SELECT *
    FROM t1
    GROUP BY id_user
    HAVING COUNT(*)=SUM(approved)
    

    它不会像您描述的那样返回确切的结果集。但实际上你只需要

    SELECT id_user
    FROM t1
    GROUP BY id_user
    HAVING COUNT(*)=SUM(approved)
    

    因为没有规则,返回 idapproved 并不重要。

    请记住,此解决方案仅在 approved 可以为 1, 0, -1 且值可能为 2,3,4,... etc 时才有效。此解决方案将不起作用。

    更新根据您的第二个问题,您可以通过这种方式加入validation 表:

    http://sqlfiddle.com/#!9/96b4b/1

    SELECT t1.*
    FROM t1
    LEFT JOIN validation v
    ON v.id_user = t1.id_user
    GROUP BY t1.id_user
    HAVING COUNT(*)=SUM(approved)
      AND SUM(v.valid) IS NULL
    

    【讨论】:

    • 正是我想要的。是的,在我的表格中,批准的可能只是1,0,-1。先生非常感谢您。我会尽快接受你的回答。
    • Alex,如果您能查看我所做的更改,我将不胜感激。再次感谢您。
    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多