我有一个包含如下内容的表的数据库:
message_number message_type message_chat
0 IN Hi
1 OB Hello
2 IN Help
3 IN Want to find this thing
4 OB Sure
5 OB Please let me know
我已经写了 5 行,因为我想在我显示的示例表中合并我想要查询的所有可能情况。
现在在我的查询输出中,我想要这样的东西:
message_in message_out
Hi Hello
Help NULL
Want to find this string Sure
NULL Please let me know
所以我想考虑的情况是:
假设如果 message_number=0 和 message_number=1 的 message_type 值为 IN,则将 message_chat_in 设为 message_chat(在 message_number=0)并将 message_chat out 设为 NULL,然后迭代 message_number=1
<如果 message_number =0 的 message_type=IN 和 message_number =1 的 message_type=OB,则将 message_chat(at message_number=0) 显示为 message_chat_in 并将 message_chat(at message_number=1) 显示为 message_out 并且不要迭代 message_number= 1;
希望我已经阐明了条件,尽管我在预期输出中包含了所有三个条件。我的 sqlquery 应该是什么样子?
编辑:我使用的是 mysql 版本 5.5.8
最佳答案
尝试下面的查询
SELECT
q1.message_number in_num,
q1.message_chat in_chat,
q2.message_number out_num,
q2.message_chat out_chat
FROM
(
SELECT *,@i1:=IFNULL(@i1,0)+1 num
FROM Chat
ORDER BY message_number
) q1
LEFT JOIN
(
SELECT *,@i2:=IFNULL(@i2,0)+1 num
FROM Chat
ORDER BY message_number
) q2
ON q2.num=q1.num+1 AND q2.message_type<>q1.message_type
WHERE q1.message_type='IN'
UNION ALL
SELECT
q1.message_number in_num,
q1.message_chat in_chat,
q2.message_number out_num,
q2.message_chat out_chat
FROM
(
SELECT *,@i3:=IFNULL(@i3,0)+1 num
FROM Chat
ORDER BY message_number
) q1
RIGHT JOIN
(
SELECT *,@i4:=IFNULL(@i4,0)+1 num
FROM Chat
ORDER BY message_number
) q2
ON q2.num=q1.num+1 AND q2.message_type<>q1.message_type
WHERE q2.message_type='OB'
AND q1.message_type IS NULL
ORDER BY IFNULL(in_num,out_num)
SQL fiddle -http://sqlfiddle.com/#!9/95a515/1
第二种变体
SET @i1 = 0;
SET @i2 = 0;
SET @i3 = 0;
SET @i4 = 0;
-- the same query
SQL fiddle -http://sqlfiddle.com/#!9/95a515/2
或者
SELECT 0,0,0,0 INTO @i1,@i2,@i3,@i4;
-- the same query
SQL fiddle -http://sqlfiddle.com/#!9/95a515/5
关于mysql - 三个条件的sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47428915/