无条件地加入同一个表 - mysql

时间:2013-02-06 12:09:25

标签: mysql sql join

我有一张有记录的表

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

我认为这是因为条件没有任何相同之处。我该怎么办?

2 个答案:

答案 0 :(得分:0)

我相信这是因为您在多个列上设置了同一列的多个值...这样它最终可能看起来像是多行。

似乎如果你在选择之后放置一个“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) 

答案 1 :(得分:0)

问题是您加入了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 with Demo

结果是:

| QUEUE1 | QUEUE2 |
-------------------
|     69 |    142 |
|    133 | (null) |