0

可能重复:
MYSQL 不返回重复行

我知道以前有人问过这个问题,但我还没有看到任何适合我的情况的解决方案。典型的 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

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

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

谢谢!

4

4 回答 4

2

您可以使用 GROUP BY 吗?

SELECT Hostname,Site,Rack FROM hardwaredb WHERE Rack LIKE '%Rack1%' GROUP BY Hostname
于 2013-01-22T21:54:16.317 回答
1

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

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

您也可以尝试使用SELECT DISTINCT关键字,但如果您以前没有使用过它可能会产生意想不到的结果......

于 2013-01-22T21:58:59.730 回答
1

据我了解,您可以在使用 DISTINCT 之后实现您的目标(只要所有三列在示例数据中都是不同的,就可以工作)。

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

如果站点和机架中的值不同,那么您可以使用:

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 标准,即在选择列表中包含不依赖于 group by 项目的列。在不了解您的确切要求的情况下,尽管很难发布替代方案。

于 2013-01-22T22:03:44.890 回答
1

尝试这个:

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

编辑:有子句会帮助你在分组子句上设置条件

于 2013-01-22T21:57:45.353 回答