首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL查询匹配特定IP地址

SQL查询匹配特定IP地址
EN

Stack Overflow用户
提问于 2018-07-25 06:08:43
回答 3查看 736关注 0票数 0

我有一个包含如下数据的表:

代码语言:javascript
复制
IP             ACCESS_DATE
----------------------------
192.168.1.5    06/22/2018
192.168.1.5    06/20/2018
192.168.1.5    06/18/2018
192.168.1.7    06/22/2018
192.168.1.7    05/01/2018
192.168.1.212  06/22/2018
10.10.10.1     06/22/2018

这是SQL Server,所以不能使用inet ...

我的IP列被定义为varchar(20)

我有一个查询,它列出了与该表中所有IP地址相关联的最近日期,我相信它工作得很好。但是,我似乎不能让它返回特定IP的结果。

这是一个有效的查询:

代码语言:javascript
复制
SELECT 
    t.IP, t.ACCESSS_DATE 
FROM
    (SELECT 
         IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
     FROM  
         USER_ACCESS_HISTORY
     GROUP BY
         IP) x 
JOIN 
    USER_ACCESS_HISTORY t ON x.IP = t.ip
                          AND x.ACCESSS_DATE = t.ACCESSS_DATE

但如果我这样做:

代码语言:javascript
复制
SELECT 
    t.IP, t.ACCESSS_DATE 
FROM
    (SELECT 
         IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
     FROM
         USER_ACCESS_HISTORY
     GROUP BY IP) x 
JOIN 
    USER_ACCESS_HISTORY t ON x.IP = '192.168.1.5'
                          AND x.ACCESSS_DATE = t.ACCESSS_DATE

它返回

代码语言:javascript
复制
192.168.1.5    06/22/2018
192.168.1.7    06/22/2018
192.168.1.212  06/22/2018

任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-25 06:13:09

更改此设置:

代码语言:javascript
复制
ON x.IP =t.ip

要这样做:

代码语言:javascript
复制
ON x.IP ='192.168.1.5'

断开查询中USER_ACCESS_HISTORY表和子查询之间的关系,因此不再关联任何内容。你想要这个:

代码语言:javascript
复制
SELECT t.IP, t.ACCESSS_DATE 
FROM( 
    SELECT IP,MAX(ACCESSS_DATE) AS ACCESSS_DATE
    FROM USER_ACCESS_HISTORY
     GROUP BY IP
) x 
JOIN USER_ACCESS_HISTORY t ON x.IP =t.ip
    AND x.ACCESSS_DATE = t.ACCESSS_DATE
WHERE x.IP ='192.168.1.5'

这将保留关系,并将数据过滤到所需的IP。

即使这样看起来也比您需要的要复杂得多(仅仅是子查询就足够了),但是我假设我们看到的只是查询的一个压缩版本来说明这个问题。我确实提出了它,以防您可以像这样减少查询:

代码语言:javascript
复制
SELECT IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
FROM USER_ACCESS_HISTORY
WHERE IP = '192.168.1.5'
GROUP BY IP 
票数 1
EN

Stack Overflow用户

发布于 2018-07-25 06:12:01

您的版本将获取与给定ip的最大日期相同的所有ip。也就是说,它缺少一个关于x.ipt.ip相等的附加条件。

如果只需要ip和date,那么就不需要外部查询--子查询生成这两个列。

就我个人而言,我将使用相关子查询:

代码语言:javascript
复制
select uah.*
from user_access_history uah
where uah.access_date = (select max(uah2.access_date)
                         from user_access_history uah2
                         where uah2.ip = uah.ip
                        );

您可以将where子句添加到外部查询。

使用user_access_history(ip, access_date)上的索引,这应该比您的问题所建议的版本更快。

票数 1
EN

Stack Overflow用户

发布于 2018-07-25 06:18:50

因为你已经知道了IP,所以实际上你不需要任何joins:

代码语言:javascript
复制
SELECT IP, MAX(ACCESSS_DATE) AS ACCESSS_DATE
from USER_ACCESS_HISTORY
where IP ='192.168.1.5'
group by IP
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51508213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档