我有一个连接到我服务器的数据库,目前有2,300,000行。
我运行以下查询以查找用户的连接,如果nick / ip / client_id相同则删除重复项。
SELECT
`nick`,
INET_NTOA(`ip`) as `ip`,
HEX(`client_id`) as `client_id`,
UNIX_TIMESTAMP(`date`) as `date`
FROM
(SELECT * FROM `joins` ORDER BY `date` DESC) as `sub`
WHERE
`nick` LIKE '%nick%'
-- Can also be things like this:
-- `ip` & INET_ATON('255.255.0.0') = INET_ATON('123.123.0.0')
GROUP BY
`nick`,
`ip`,
`client_id`
ORDER BY
`date` DESC
LIMIT 500
为什么我首先使用子查询?使用GROUP BY
时获取最新日期值。
答案 0 :(得分:1)
我认为您误解了ORDER BY
和GROUP BY
在此查询中的作用。为了获得每nick,ip,client_id
的最新日期,您可以按如下方式编写查询:
SELECT `nick`, INET_NTOA(`ip`) as `ip`, HEX(`client_id`) as `client_id`, MAX(UNIX_TIMESTAMP(`date`)) as `date` FROM `joins` WHERE `nick` LIKE '%nick%' -- Can also be things like this: -- `ip` & INET_ATON('255.255.0.0') = INET_ATON('123.123.0.0') GROUP BY `nick`, `ip`, `client_id` ORDER BY `date` DESC LIMIT 500
根本不需要子查询。此代码对数据进行分组,然后返回
的最大值UNIX_TIMESTAMP(`date`)
为date
。