Mysql选择distinct如果列等于否则不选择

时间:2015-10-01 13:45:12

标签: mysql select distinct

我有一张这样的表:

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

我想只在每个id_users批准的每个id_users等于1时选择id_user的distict值。 输出:

   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的那些行。id_user表中可能不存在第一个表中的validation。在这种情况下,查询应该返回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,但在第二个表中不存在,我希望它被选中。

1 个答案:

答案 0 :(得分:2)

这是我的方法: 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)

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

请注意,只有approved 1, 0, -1只有2,3,4,... etc,如果值validation此解决方案不起作用,此解决方案才有效。

更新根据您的第二个问题,您可以通过以下方式加入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 表:

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

jQuery("#myul > li").click(function(){

    alert('hey!');

});