Mysql 检查列的唯一值

Mysql 检查列的唯一值,mysql,sql,Mysql,Sql,我的桌子: id attribute 1 2 1 2 2 3 2 4 5 1 5 1 6 3 6 3 6 5 现在,如果每个id的属性相同,我只想用attribute输出那些id 在此示例表中,输出为 id attribute 1 2 5 1 您可以使用这种方法: SELECT DISTINCT id, attribute FROM test t1 WHERE (SELECT count(DISTINCT attribute) FROM test t

我的桌子:

id attribute
1  2
1  2
2  3
2  4
5  1
5  1
6  3
6  3
6  5
现在,如果每个
id
的属性相同,我只想用
attribute
输出那些
id

在此示例表中,输出为

id attribute
1  2
5  1

您可以使用这种方法:

SELECT DISTINCT id, attribute 
FROM test t1 
WHERE (SELECT count(DISTINCT attribute) 
       FROM test t2 
       WHERE t2.id = t1.id) = 1
更好的办法可以是:

SELECT
   DISTINCT t1.id, t1.attribute
FROM
   test t1,
   (
      SELECT
         id,
         count(DISTINCT attribute) COUNT
      FROM
         test
      GROUP BY
         id
      HAVING
         COUNT = 1
   ) t2
WHERE
   t1.id = t2.id

那么,我将使用以下方法:

     SELECT DISTINCT ta.id, ta.attribute
       FROM test ta
  LEFT JOIN test tb
         ON ta.id = tb.id AND ta.attribute <> tb.attribute
      WHERE tb.id IS NULL;
选择不同的ta.id、ta.attribute
来自测试ta
左连接测试tb
在ta.id=tb.id和ta.attribute上tb.attribute
其中tb.id为空;
。。。我通常倾向于至少尝试用联接表替换嵌套查询。当然,如果你的桌子很小,那也没什么大不了的

SELECT id, MIN(attribute) AS attribute 
FROM test  
GROUP BY id
HAVING COUNT(DISTINCT attribute) = 1 ;
或:


我希望上一个版本在
(id,attribute)

上有一个索引会非常有效。这个方法效率非常低,因为它会对测试中的每一行运行内部查询。随着表格的增长,这将很快开始影响性能。@Braiba:你说得对。第二种方法可以降低复杂性,内部查询的功能与ypercube的第一种相同;我看不到外部查询在这里添加了什么,或者我遗漏了什么吗?嵌套查询很好,只要您加入它们,而不是将它们放在SELECT/WHERE/ON子句中。不过,像这样把一张桌子连在一起也没什么好处;随着表的增长,处理时间仍将呈指数增长。最有效的方法是+1。最小=最大的东西真的很聪明;我将来会记住这个诀窍。我也很喜欢这个答案。这是什么礼节?先到先得还是最佳答案?@Terry Uhlang best answer对我来说最有意义,因为这将是其他有相同问题的用户在搜索此问题时看到的第一个答案。@TerryUhlang:您使用的答案、对您帮助最大的答案或您认为最好的答案。您可以选择:如果
MIN(attribute)=MAX(attribute)
只需
选择id,attribute
?在这种情况下重用
MIN()
会有一些性能优势吗?
SELECT id, MIN(attribute) AS attribute
FROM test 
GROUP BY id
HAVING MIN(attribute) = MAX(attribute) ;