2016-08-17 13 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

US UNION ALLUNIONではなくむしろ。 UNIONを使用すると、データベースは不必要に存在しない重複を探しています。すべてのUNIONクエリには、 "server like(some unique value)"のようなWHERE節が含まれています。 serverはこれらの2つ以上には等しくないので、除外するための重複はありません。

また、likeの代わりに=を使用してください。 LIKEは、実行していないワイルドカード検索を実行する場合に使用されます。

1

1つのオプションはserverがあなたのUNIONクエリ内の5つの値のいずれかを実行し、各serverグループのためにあなたのテーブルからの完全なレコードを選択することができ、各serverグループ、の最大reg_dateを見つけることであろう。

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秒:/ –

0

このような何かがそれを実行する必要があります。後半に

select 
    serverTable.col1, 
    serverTable.col2, 
    serverTable.col3, 
    max(reg_date) 
from 
    serverTable 
where 
    server in ('[email protected]','[email protected]','[email protected]','[email protected]','[email protected]') 
group by 
    serverTable.col1, 
    serverTable.col2, 
    serverTable.col3 
order by 
    server, reg_date; 
+0

申し訳ありませんが、私はこれを見てする機会を持っていませんでした。今夜はこれに戻ります – user3502374