2011-09-07 58 views
2

我需要从数据库中选择只有一列具有特定值的所有行。也就是说,如果两行具有“ABC”作为其列arbitrary的值,那么它们不会被返回。在单个查询中从MySQL中选择唯一值

我希望这足够清楚的措辞,以了解我在问什么。使用MySQL的DISTINCT关键字不适合我需要做的事情,因为使用它需要多个查询。我希望能够在一个很好,紧凑的查询中做到这一点,因为它会被频繁执行。我正在扩展我的应用程序以允许更高程度的并发性,而我现在的代码不会再削减它了。

目前,我正在使用DISTINCT为所涉及的列选择每个唯一值,然后在另一个查询中检查这些值中的每一个以查看它们是否仅存在一次。如果是这样,保留它,如果没有,扔掉它。肯定有更谨慎的方式去做这件事?

谢谢。

回答

6
SELECT * FROM table1 
GROUP BY the_column_that_must_be_unique 
HAVING COUNT(*) = 1 

只选择那些重复的值,然后仅仅是最近的,这样我们就可以扔掉那些出去,让拨打the_column_that_must_be_uniqueü短:-)

SELECT t1.* FROM table1 t1 
INNER JOIN table1 t2 ON (t1.u = t2.u AND t1.id > t2.id) 

注意我假设ID由一个自动递增的整数ID,所以更大的ID意味着更新的项目。如果这不是真的比做

SELECT t1.* FROM table1 t1 
INNER JOIN table1 t2 ON (t1.u = t2.u AND t1.id <> t2.id) 
WHERE t1.atimestamp > t2.atimestamp 
+0

完美的,我从来没有意识到之前,HAVING关键字。我会实现这一点,非常感谢! –

+0

'有'是一个适用于聚合的地方。它起作用的原因是它在**集合被评估后被调用**,所以它可以对它们进行测试,where子句不能,因为它在**完全计算之前得到测试**。 – Johan

+0

如果这回答了你的问题,请检查答案,以便Johan能够收到他应得的分数,而其他读者可以很容易地看出哪个答案解决了问题。 –

1
SELECT col1,col2,.... 
FROM table_name 
GROUP BY arbitrary 
HAVING COUNT(arbitrary) =1 
+0

+1,但'count(*)= 1'可能运行速度更快(并且永远不会变慢) – Johan

+0

感谢您的信息:) – confucius