0

我正在尝试制作一个将选择多个列(uniqueID、IPaddress、date、country)的查询,但我希望查询仅选择在给定日期出现相同 IPaddress 和 UniqueID 的那些记录。我已经试了 ...

SELECT uniqueID AS uniqueID, 
IPAddress AS IPAddr,
Date AS DDate, 
Location AS Countries,
COUNT(IPAddress) AS IPCount
FROM History WHERE (uniqueID= 20677) 
GROUP BY Date
ORDER BY DDate DESC, IPAddr DESC 

但它确实消除了一天只出现一个 Ip/UniqueID 的记录。我真的只想找到uniqueID 在同一天以不同 IPaddresses 出现的记录。

4

2 回答 2

0

不确定我是否完全遵循,但听起来您想加入子查询:

SELECT a.*
FROM History a
JOIN (  SELECT uniqueID, Date, COUNT(DISTINCT IPAddress)
        FROM History 
        GROUP BY uniqueID,Date
        HAVING COUNT(DISTINCT IPAddress) > 1
     )b
ON a.uniqueID = b.uniqueID
AND a.date = b.date

编辑:误读了您的不同 IP 地址部分,已更新。

子查询将向您显示具有相同唯一 ID/日期的多个 IP 地址的所有记录,然后将其加入您的历史记录表会显示您所追求的记录的所有字段。

于 2013-06-03T19:12:25.257 回答
0

如果要在其中查找重复项,则需要按三个字段分组:

SELECT uniqueID, IPAddress, "Date" AS DDate, Location AS Countries,
       COUNT(IPAddress) AS IPCount
FROM History
WHERE uniqueID = 20677
GROUP BY uniqueId, IPAddress, "Date"
having IPCount > 1;

您实际上并不需要uniqueidingroup by子句,因为您只选择了一个。但是,我认为它使查询的意图更加清晰。

如所写,这将产生一个错误(因为location不在聚合子句中)或返回一个随机值location,如果您使用的是 MySQL)。如果是后者,请尝试:

SELECT uniqueID, IPAddress, "Date" AS DDate,
       group_concat(Location) AS Countries,
       COUNT(IPAddress) AS IPCount
FROM History
WHERE uniqueID = 20677
GROUP BY uniqueId, IPAddress, "Date"
having IPCount > 1;

此外,在数据类型和函数之后命名列也不是一个好主意。在许多数据库中,date既是数据类型又是函数。其他一些名称,如DateAdded避免这种冲突。

于 2013-06-03T19:13:49.707 回答