2015-02-14 2 views
0

У меня есть таблица customershipments с записями клиентов. Столбцы Item и OrderNumber. Я хочу видеть полный набор, где Item находится на более чем одном уникальном OrderNumber.Не удается просмотреть полный набор: Self Join - Сравнить где Column1 = и Column2 <>

SELECT 
    distinct 
    cs.item 
    ,cs.ordernumber 
FROM 
    customershipments cs 
JOIN 
    customershipments cs2 
     ON cs.item = cs2.item 
     AND cs.ordernumber <> cs2.ordernumber 
WHERE 
    AND cs.cdate > NOW() - INTERVAL 1 WEEK 
    AND cs.isactive = 1 
    AND cs.item <>'' 
    AND cs.hostcompany_id =19 
ORDER BY 
    cs.item, cs.ordernumber 

Это делает Идентифицировать items, что я хочу, но возвращает только первый OrderNumber, а не второй. ОЧЕНЬ не будет TWO OrderNumber для item, тогда он показывает мне ВСЕ случаи. Я не могу понять, почему. Как я уже сказал, это работает достаточно хорошо, чтобы указать записи (на основе элемента), которые мне нужно управлять, но это не показывает мне исчерпывающий список порядковых номеров.

ответ

0

Вам не нужна самоподготовка. Просто используйте агрегацию. Для того, чтобы получить список элементов:

select item 
from customershipments cs 
where cs.cdate > NOW() - INTERVAL 1 WEEK and 
     cs.isactive = 1 and 
     cs.item <> '' and 
     cs.hostcompany_id =19 
group by item 
having count(distinct ordernumber) > 1; 

Вы можете присоединиться к этому вернуться, чтобы получить список заказов:

select cs.* 
from (select item 
     from customershipments cs 
     where cs.cdate > NOW() - INTERVAL 1 WEEK and 
      cs.isactive = 1 and 
      cs.item <> '' and 
      cs.hostcompany_id =19 
     group by item 
     having count(distinct ordernumber) > 1 
    ) i join 
    customershipments cs 
    on cs.item = i.item; 

Или получить список порядковых номеров на одной линии:

select item, group_concat(ordernumber) 
from customershipments cs 
where cs.cdate > NOW() - INTERVAL 1 WEEK and 
     cs.isactive = 1 and 
     cs.item <> '' and 
     cs.hostcompany_id =19 
group by item 
having count(*) > 1; 
+0

Но мне нужно, где, где элемент имеет несколько порядковых номеров и порядковые номера, различны. – user3242558

+0

@ пользователь3242558. , , Затем используйте 'count (distinct)' вместо 'count (*)'. –

+0

Oh - geez. Да. Ты прав. И причина, по которой я не получил список, который, как я думал, должен был быть, состоял в том, что в результирующем наборе были только «элементы», а остальные комбинации, которые не отображались, были связаны с тем, что они не соответствовали условию интервала cdate. Мел, который до пятничного вечернего выгорания. Благодаря! Я не могу продвигать, но это помогло. – user3242558