2016-08-17 85 views
4

完成工作,但我觉得我违反了编程规则。mysql更高效的查询方式

select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 

有没有更好的方法或正确的方法来完成这件事?

回答

0

USE UNION ALL而不是UNION。通过使用UNION,数据库不必要地查找不存在的重复项。所有UNIONed查询都包含一个WHERE子句,如“像服务器(某些唯一值)”。 server不能等于其中的一个以上,因此您将不会有任何重复项过滤掉。

此外,使用=而不是likeLIKE用于当你想做一个通配符搜索,你不这样做。

1

一个办法是找到最大reg_date每个server组,其中server可以在你的UNION查询5个值中的一个,然后选择从表中的全部记录每个server组。

SELECT t1.* 
FROM serverTable t1 
INNER JOIN 
(
    SELECT server, 
      MAX(reg_date) AS reg_date 
    FROM serverTable 
    WHERE server in ('[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]') 
    GROUP BY server 
) t2 
    ON t1.server = t2.server AND 
     t1.reg_date = t2.reg_date 
+0

25秒至晚:/ –