0

我有一张有记录的表

id_queue | 用户 ID | 身份证 | 地位
   69 | 5 | 4 | 1
   133 | 3 | 4 | 2
   142 | 1 | 4 | 0

我想要一个能给我这个结果的查询

id_queue | id_queue
   69 | 142    
   133 | 无效的 

我试过这样的东西

选择 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

我认为这是因为我没有任何相同的条件。我能做些什么?

4

2 回答 2

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) 
于 2013-02-06T12:37:11.253 回答
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

结果是:

| QUEUE1 | QUEUE2 |
-------------------
|     69 |    142 |
|    133 | (null) |
于 2013-02-06T13:09:11.373 回答