2011-12-23 22 views
1

私のMySQLデータベースは、ID、名前、データ、および場所の4つのフィールドを持つテーブル(cfg)を持っています この1つのテーブルは、いくつかのサブドメイン私は特定のサブドメイン(場所)の各名前の最新の行のリストを取得する必要があります。複雑なSQL結合クエリ - 最新の行を取得

例データ

id name data location 
--------------------------- 
1 color red dc 
2 color blue dc 
3 size large sj 
4 color green sj 
5 size small dc 

次のクエリは正常に動作しますが、それはあまりにも複雑で遅いようです。誰にでも提案はありますか?

SELECT c1.name, c1.data 
FROM (SELECT * FROM cfg WHERE location = "dc") as c1 
LEFT JOIN (SELECT * FROM cfg WHERE location = "dc") as c2 ON (c1.name = c2.name 
AND c1.id < c2.id) 
WHERE c2.id IS NULL 

それは

name  data 
-------------- 
color blue 
size  small 

答えて

2

が最大を計算GROUP BYでサブクエリを使用して返します。 nameあたりid

SELECT cfg.* 
FROM cfg 
JOIN (
    SELECT max(id) AS max_id 
    FROM cfg c0 
    WHERE location = 'dc' 
    GROUP BY name 
    ) n ON n.max_id = cfg.id 
+0

ありがとうございました。これはトリックでした! – Nathan

0

私は

select c.name, c.data 
from cfg c 
join (
select max(id) id 
from cfg 
group by name 
where location = 'dc' 
) nameMaximums on nameMaximums.id = c.id 

とだけテストされていないフリーハンドです(場所、名前、ID)にインデックスとだけ(ID)に1

0
select name, data 
from cfg 
where id in (select max(id) from cfg where location = "dc" group by name) 

を使用すると思いますしかし、私はあなたがその考えを得ると思う。これは、カラムIDが一意であることを前提としています。