1

テーブルがあります:

create table ducks (id int(8) primary key not null auto_increment,
                    name varchar(255),
                    car varchar(255), 
                    money int(8)
                   );
insert into ducks set name='donald', car='none', money=10;
insert into ducks set name='scrudge', car='bip', money=10000;
insert into ducks set name='mac', car='bip', money=1000;
insert into ducks set name='joe', car='boo', money=2000000;

これを分析すると、次のリクエストでクエリが遅いことがわかりました。

select name,money from ducks where car='bip' order by money DESC LIMIT 1;

テーブルが大きく、1 つのレコードを取得するためだけにソートすると非常に長いため

私は、以下がより速く動作することを発見しました:

select distinct name,money from ducks where money=(select max(money) from ducks where car='bip')  LIMIT 1;

しかし、それはサブセレクトであるため、まだわかりません。

これを解決する一般的な方法は何ですか?

http://sqlfiddle.com/#!2/d2b7ed/6

更新すると、実際には同じ車を検索するのではなく、100000ドル未満の最も裕福なアヒルを検索するタスクがあることがわかりました

http://sqlfiddle.com/#!2/d2b7ed/21

4

1 に答える 1

1

サブクエリに注意するのが賢明です。特にMySQLで。

次のクエリは自己除外結合を使用しており、基本的なテストでは3つのうちの最良のものを実行します。あなたの最初の解決策は問題ありませんが、あなたが言うように遅いです。また、ANSIに準拠していませんが、それはあなたにとって重要ではないかもしれません。2番目のソリューションも問題ありませんが、MySQLはサブクエリを処理せず、期待どおりに処理されません。少なくとも伝統的に。

select 
  d.name, d.money
from 
  ducks d
  left join ducks d2 
  on d2.car = d.car 
  and d2.money > d.money
where 
  d.car = 'bip'
  and d2.id is null

ここに実装:http ://sqlfiddle.com/#!2/27711/20


編集:ゴールポストはどういうわけか移動しました。それらのゴールポストをくそったれ。これは、新しい問題の自己排除結合ソリューションです:http ://sqlfiddle.com/#!2/7146d/13

select 
  d.name, d.money 
from 
  ducks d
  left join ducks d2 
  on d2.money > d.money
  and d2.money < 100000
where 
  d.money < 100000 
  and d2.id is null;
于 2013-02-14T20:15:59.900 に答える