2016-08-17 86 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秒至晚:/ –