什么SQL查询将只返回一列中的不同值?

时间:2013-01-22 21:51:14

标签: mysql

  

可能重复:
  MYSQL don’t return duplicate rows

我之前已经问过这个问题,但是我没能看到任何适合我情况的解决方案。典型的SQL语句如下所示:

SELECT Hostname,Site,Rack FROM hardwaredb WHERE Hostname LIKE '%$hostval%'

$ hostval是一个powershell变量,它被系统名称替换。因此,如果我有一个名为OldGlory117的系统,则该语句将如下所示:

SELECT Hostname,Site,Rack FROM hardwaredb WHERE Hostname LIKE '%OldGlory117%'

由于其他列,某些行是重复的,并且数据库中存在重复的主机名。所以上面的查询可能会返回:

OldGlory117    USA    Rack1
OldGlory117    USA    Rack1
OldGlory117    USA    Rack1

当我没有找到导致重复的列时,这是有问题的。有没有办法只返回具有hostname唯一值的行?如果我没有在WHERE语句中指定主机名怎么办?例如:

SELECT Hostname,Site,Rack FROM hardwaredb WHERE Rack LIKE '%Rack1%'

谢谢!

4 个答案:

答案 0 :(得分:2)

您是否可以使用GROUP BY?

SELECT Hostname,Site,Rack FROM hardwaredb WHERE Rack LIKE '%Rack1%' GROUP BY Hostname

答案 1 :(得分:1)

试试这个:

SELECT Hostname,Site,Rack FROM hardwaredb WHERE Rack LIKE '%Rack1%' having count(Hostname)=1 GROUP BY Hostname,Site,Rack

编辑: having子句将帮助您按条件

设置条件

答案 2 :(得分:1)

以下代码将为您完成这项工作:

SELECT Hostname,Site,Rack FROM hardwaredb WHERE Hostname LIKE '%$hostval%'
GROUP BY Hostname, Site, Rack

您也可以尝试使用SELECT DISTINCT关键短语,但如果您之前没有使用它,可能会产生意外结果......

答案 3 :(得分:1)

根据我的理解,您可以在使用DISTINCT后实现您的目标(只要所有三列都与样本数据中的不同,就可以正常工作)。

SELECT  DISTINCT Hostname,Site,Rack 
FROM    hardwaredb 
WHERE   Rack LIKE '%Rack1%'

如果Site和Rack中的值不同,那么您可以使用:

SELECT  DISTINCT Hostname
FROM    hardwaredb 
WHERE   Rack LIKE '%Rack1%'

最后,如果您在站点和机架中的值不同,但是您需要使用这些列中的每个值的值(排序依据很重要,否则查询变得不确定,并且在查询相同数据时可能会产生不同的结果) :

SELECT  HostName, Site, Rack
FROM    hardwaredb 
WHERE   Rack LIKE '%Rack1%'
GROUP BY HostName
ORDER BY Rack, Site;

但是,我个人不喜欢这个解决方案,它在大多数DBMS中都不起作用,并打破了ANSI标准,包括选择列表中不依赖于组中项目的列。虽然很难发布替代方案,但却没有理解你的确切要求。