1

私の MySQL データベースには、id、name、data、および location の 4 つのフィールドを持つテーブル (cfg) があります。この 1 つのテーブルは、複数のサブドメイン (location) にサービスを提供するためのものです。特定のサブドメイン (場所) の名前ごとに最新の行のリストを取得する必要があります。

サンプルデータ

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
4

3 に答える 3

2

GROUP BY最大値を計算するサブクエリを使用します。idあたりname:

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
于 2011-12-23T20:58:42.943 に答える
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)だけにインデックスを使用します

于 2011-12-23T21:05:10.270 に答える
0
select name, data
from cfg
where id in (select max(id) from cfg where location = "dc" group by name)

それはテストされていないフリーハンドですが、あなたはその考えを理解していると思います. これは、列 ID が一意であることを前提としています。

于 2011-12-23T21:05:24.463 に答える