我有一张有记录的表
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
我认为这是因为条件没有任何相同之处。我该怎么办?
答案 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
结果是:
| QUEUE1 | QUEUE2 |
-------------------
| 69 | 142 |
| 133 | (null) |