2016-07-06 84 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."%'。你最好使用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

对于每个相关表格,从'show create table tablexyz'输出。尝试获得一些合成索引,谁知道,即使是覆盖索引。当然,从'explain'输出。根据'article_number'的宽度,'(price,article_number)'上的组合可能会很甜 – Drew