Присоединиться к одной таблице без условий - mysql

У меня есть таблица с записями

id_queue | user_id | id_book | status
   69    |    5    |    4    |   1
   133   |    3    |    4    |   2
   142   |    1    |    4    |   0

Я хочу запрос, который даст мне этот результат

id_queue | id_queue
   69    |    142    
   133   |    null 

Я пробовал что-то вроде этого

SELECT s1.`id_queue`,s2.`id_queue` FROM `second` as s1
LEFT JOIN `second` as s2 ON s2.`book_id`=4 AND s2.`status` IN (0)
WHERE s1.`book_id`=4 AND s1.`status` IN (1,2,4) 

но это продолжает приносить мне этот результат.

id_queue | id_queue
   69    |    142    
   133   |    142

Я думаю, это потому, что у меня нет ничего идентичного для условий. Что я могу сделать?


person arus    schedule 06.02.2013    source источник
comment
есть ли причина помещать 69 и 133 в столбец, отличный от 142 и null?   -  person Czar Pino    schedule 06.02.2013


Ответы (2)


Проблема в том, что вы присоединяетесь к book_id, а не к статусу, поэтому у вас всегда будет соответствующая строка.

Если вы хотите скрыть второй экземпляр второго id_queue, вы можете использовать пользовательские переменные:

select Queue1,
  case when seq = 1 then queue2 else null end Queue2
from
(
  select 
    Queue1,
    Queue2,
    @row:=(case when @prev=Queue2 then @row else 0 end) +1 as Seq,
    @prev:=Queue2 
  from
  (
    SELECT 
      s1.`id_queue` Queue1,
      s2.`id_queue` Queue2
    FROM `second` as s1
    LEFT JOIN `second` as s2 
      ON s1.`id_book` = s2.`id_book`
      AND s2.`status` = 0
    WHERE s1.`id_book`=4 
      AND s1.`status` IN (1,2,4)
  ) src, (SELECT @row:=0, @prev:=null) r
  order by Queue1, Queue2
) s1
order by Queue1, Queue2

См. SQL Fiddle с демонстрацией.

Результат:

| QUEUE1 | QUEUE2 |
-------------------
|     69 |    142 |
|    133 | (null) |
person Taryn    schedule 06.02.2013
comment
Спасибо, это сработало просто отлично!!!! Мне нужно узнать больше о случаях и определяемой пользователем переменной! - person arus; 13.06.2013

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

И кажется, что если вы поместите команду «DISTINCT» сразу после выбора, это не приведет к исчезновению какого-либо значения, поскольку оно проверит, совпадают ли все столбцы строки с другим.

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

Хотел бы я помочь вам больше.

Пример:

    SELECT s1.`id_queue`, DISTINCT (s2.`id_queue`)
    FROM `second` as s1
    LEFT JOIN `second` as s2 ON s2.`book_id`=4 AND s2.`status` IN (0)
    WHERE s1.`book_id`=4 AND s1.`status` IN (1,2,4) 
person Rafael    schedule 06.02.2013