2016-07-06 2 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'출력을위한 촬영. 어떤 합성 인덱스를 알고 있는지, 심지어 커버 된 인덱스를 얻으려고 노력하십시오. 그리고 물론, '설명'에서 출력. '(price, article_number)'의 합성은'article_number'의 너비에 따라 달라질 수 있습니다. – Drew