2016-10-16 3 views
0

У меня есть таблица order_detail с этим INFORMATIONSПолучить наиболее продаваемые продукты с указанными один

id_order id_product 
1   2 
1   3 
2   2 
2   4 
2   5 
2   3 
3   2 
3   1 
4   2 
4   3 
4   1 
4   6 

Я хотел бы получить наиболее продаваемые продукты (первые 5 элементов) с текущим продуктом, скажем, продукт ИН 2

Я попытался это, но он возвращает один неверный результат

SELECT od2.product_id, count(od2.`product_id`) FROM `ps_order_detail` od1 
LEFT JOIN ps_order_detail od2 ON od1.id_order = od2.id_order where 
od2.product_id != od1.product_id AND od1.product_id=2 

результат должен быть

product_id count(od2.`product_id`) 
3    3 
4    2 
1    1 
5    1 
6    1 

ответ

1

Ваш запрос находится на правильном пути. Главным образом, вы АКТИВНЫЙ group by отсутствует:

select od.product_id, count(od2.id_order) as NumTimesWith2 
from ps_order_detail od left join 
    ps_order_detail od2 
    on od.id_order = od2.id_order and 
     od2.product_id = 2 
where od.product_id <> 2 
group by od.product_id 
order by count(od2.id_order) desc; 

Если вы хотите только один такой продукт, а затем добавить limit 1 к запросу.

Также предполагается, что продукты не повторяются внутри заказов. Если они могут быть, вы можете быстро получить лучший счет, используя count(distinct od.id_order)).

+0

Thnks очень много очень быстро, но почему я получаю идентификатор продукта 2 в результате? –

+0

@tarekfellah. , , Я изначально написал запрос как внутреннее соединение и имел «od2.id_product <> od.id_product'. С внутренним соединением это будет фильтр. Однако «левое соединение» делает что-то еще (установка столбцов в «NULL» вместо фильтрации). Я исправил ответ. –

+0

Почему вы заказываете по счету (*), он возвращает не упорядоченные результаты, я изменился с порядком по счету (od2.id_order), и кажется, что он работает –