我有一个 MDM,其中有 iPhone 报告其库存。我想运行一个查询来获取他们 2014 年的 IP 地址历史记录。我的目标是每天为每台设备获取一行。我目前有一个每天返回多行的查询,因为他们向 MDM 报告 IP 的频率很高。例如:
display_name device_name ip_address date_entered
john_smith john_smiths_iphone 10.1.0.122 2014-05-27 12:36:44
john_smith john_smiths_iphone 10.1.0.122 2014-05-27 13:34:25
john_smith john_smiths_iphone 10.1.0.122 2014-05-27 14:12:34
john_smith john_smiths_iphone 10.1.0.122 2014-05-27 22:56:51
john_smith john_smiths_iphone 10.1.0.122 2014-05-27 23:06:02
我只想要 2014 年每天每台设备的第一个条目。
这是我当前正在运行的查询:
SELECT iphone_details.display_name
, iphone_details.device_name
, iphone_details.ip_address
, reports.date_entered
FROM iphone_details
, reports
WHERE date_entered LIKE "%2014%"
iphone_details
表包含以下列:display_name
、device_name
和 ip_address
reports
表有 date_entered
此查询导致返回的行过多。我从 mySQL Workbench 运行此查询时遇到错误。原来是因为我服务器上的/tmp 目录已满。因此,我通过 CLI 直接从 mySQL 服务器运行查询,并将结果输出到带有 INTO OUTFILE
的文件中,当我看到输出文件达到 22G 时,我停止了查询。
对于可能限制结果的查询,我将不胜感激。谢谢!
编辑:
我发现 iphone_details
和 reports
都有一个“report_id”。可以用来JOIN
他们吗?
最佳答案
虽然您的 JOIN 存在一些问题,即您在 reports 和 iphone_details 之间没有关系,因此将返回两个表中每一行的每个排列,以下内容将帮助您
SELECT
d.device_id,
d.display_name,
d.device_name,
d.ip_address,
DATE(reports.date_entered) AS just_date_entered
FROM iphone_details AS d
INNER JOIN reports AS r
ON r.report_id= d.report_id
AND r.date_entered >= DATE('2014-01-01')
AND r.date_entered < DATE('2015-01-01')
GROUP BY
d.device_id,
d.ip_address,
just_date_entered
首先,更改 date_entered BETWEEN AND(这将匹配到 2014-12-31 23:59:59)比在日期时间字段上进行全文搜索更有效。
其次,DATE(reports.date_entered) 仅允许提取日期时间字段的日期部分。
第三,GROUP BY 确保只返回设备、IP 地址和日期的不同组合。
(已编辑以反射(reflect)以下新信息)
关于mysql - SQL:如何限制每行返回一个日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24437082/