2016-07-06 4 views
0

LIKEに一致する最低価格の行をフェッチするために、以下のクエリを使用しています。SQL:LIKEと結合し、min()

Suppliers 
id | name   
---------------------------------------- 
1 | sup1  
2 | sup2 

Prices 
id | article_number | price | supplier_id 
------------------------------------------------ 
1 | 12345678  | 312 | 1 
2 | 12345678  | 219 | 2 
3 | 87654321  | 312 | 1 


select prices.* from prices 
inner join 
( 
    select min(price) as price, 
    article_number as article_number from prices group by article_number 
) 
min_prices on prices.price = min_prices.price 
and prices.article_number = min_prices.article_number 

WHERE prices.article_number LIKE '".$q."%' 

が、今も仕入先テーブルからsuppliers.nameを取得したい:

select prices.*, suppliers.name from prices, suppliers 
inner join 
( 
    select min(price) as price, 
    prices.article_number as article_number from prices group by prices.article_number 
) 
min_prices on price = min_prices.price 
and article_number = min_prices.article_number 

WHERE 
     prices.article_number LIKE '".$q."%' AND 
     prices.supplier_id = suppliers.id" 

これは、それがすることになっている行の18倍の量を返しますか...?

また、テーブルは10億以上の行から成っているため、効率は非常に重要です。

答えて

1

パフォーマンスのために、サブクエリでarticle_numberにインデックスを追加し、prices.article_number LIKE '".$q."%'を使用してください。 2つのテーブルを組み合わせるにはJOINではなく,(これは古い方法です)を使用することをお勧めします。このように:

select prices.*, suppliers.name 
from prices 
inner join ( 
    select min(price) as price, prices.article_number as article_number 
    from prices 
    where prices.article_number like '".$q."%' 
    group by prices.article_number 
) min_prices 
on price = min_prices.price 
and article_number = min_prices.article_number 
inner join suppliers 
on prices.supplier_id = suppliers.id 
where prices.article_number like '".$q."%' 
+0

ショー 'からの出力のための撮影ごとに、関連するテーブルのテーブルtablexyz'を作成します。カバーしているインデックスであっても知っているコンポジットインデックスを取得してみてください。もちろん、 'explain'からの出力です。 '(price、article_number)'のコンポジットは 'article_number'の幅に依存して甘くなります – Drew

関連する問題