Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何按顺序使用CASE函数?_Mysql_Sql Order By - Fatal编程技术网

Mysql 如何按顺序使用CASE函数?

Mysql 如何按顺序使用CASE函数?,mysql,sql-order-by,Mysql,Sql Order By,我的朋友几次前问我。还有一个答案,这是好的,但不适合我的情况。该解决方案的思想是将当前表连接到自身。这似乎很昂贵,对我来说也没有效果,因为实际上在我的查询中,这些表上有四个join(投票,收藏夹,评论,查看) 现在我想知道,如何使用CASE函数实现这一点?大概是这样的: ... ORDER BY Type, CASE WHEN AcceptedAnswerId = Id THEN 1 ELSE 0, timestamp // Mytable +----+--------------------

我的朋友几次前问我。还有一个答案,这是好的,但不适合我的情况。该解决方案的思想是将当前表连接到自身。这似乎很昂贵,对我来说也没有效果,因为实际上在我的查询中,这些表上有四个
join
投票
收藏夹
评论
查看

现在我想知道,如何使用
CASE
函数实现这一点?大概是这样的:

... ORDER BY Type, CASE WHEN AcceptedAnswerId = Id THEN 1 ELSE 0, timestamp
// Mytable
+----+--------------------+------+------------------+-----------+
| Id |  QuestionOrAnswer  | Type | AcceptedAnswerId | timestamp |
+----+--------------------+------+------------------+-----------+
| 1  | question1          | 0    | 3                | 1         |
| 2  | answer1            | 1    | NULL             | 2         |
| 3  | answer2            | 1    | NULL             | 3         | -- accepted answer
| 4  | answer3            | 1    | NULL             | 4         |
+----+--------------------+------+------------------+-----------+
还是有更好的解决办法


为了更具可读性,我将这些示例粘贴到这里:

我有一张这样的桌子:

... ORDER BY Type, CASE WHEN AcceptedAnswerId = Id THEN 1 ELSE 0, timestamp
// Mytable
+----+--------------------+------+------------------+-----------+
| Id |  QuestionOrAnswer  | Type | AcceptedAnswerId | timestamp |
+----+--------------------+------+------------------+-----------+
| 1  | question1          | 0    | 3                | 1         |
| 2  | answer1            | 1    | NULL             | 2         |
| 3  | answer2            | 1    | NULL             | 3         | -- accepted answer
| 4  | answer3            | 1    | NULL             | 4         |
+----+--------------------+------+------------------+-----------+
现在我想要这个结果:(请关注订单)


案例可以工作,但您缺少
结尾
。但是在这种情况下,您也可以使用
IF(AcceptedAnswerId=Id,1,0)

在您展示的简单案例中,您可以执行以下操作:

按类型排序,如果(类型=0,(@accepted:=acceptedanswerid),id@accepted),时间戳

但我不知道这是否适用于您的实际情况。

给定表定义(没有适当的索引)+示例数据

CREATE TABLE Table1
    (`Id` int, `QuestionOrAnswer` varchar(9), `Type` int, `AcceptedAnswerId` varchar(4), `related` int NOT NULL, `timestamp` int)
;

INSERT INTO Table1
    (`Id`, `QuestionOrAnswer`, `Type`, `AcceptedAnswerId`, `related`, `timestamp`)
VALUES
    (1, 'question1', 0, '3', 1, 1),
    (2, 'answer1', 1, NULL, 1, 2),
    (3, 'answer2', 1, NULL, 1, 3),
    (4, 'answer3', 1, NULL, 1, 4)
您可以使用查询

SELECT
  t2.*
FROM
  table1 as t1
JOIN
  table1 as t2
 ON
   t1.related=t2.related
 WHERE
   t1.related = 1
   AND t1.Type = 0
 ORDER BY
   t2.Type desc, t2.Id=t1.AcceptedAnswerId, t2.Id

获取特定问题的问题/答案集(
t1.related=1
你能把你当前试图用在你的问题上的SQL包括进来吗?@VolkerK,这个模式不完整。实际上有一个
related
列将相关的问题和答案链接在一起。@VolkerK你为什么要删除你的答案?你的小提琴太棒了..!总之,我有一个关于你的f的小问题iddle.正如我所说,实际上我有一个名为
related
的列,其中包含确定相关帖子。现在我用问题的
id
填充该列。我的意思是,该列包含所有答案,加上问题的id。可以吗?或者我可以存储其他内容来链接相关帖子(问题和答案)?@VolkerK我明白了,谢谢。对不起,没有更多关于这个问题的想法。我在
CASE
函数的末尾添加了
END
,现在没有任何语法错误。谢谢。但是排序仍然不起作用。我想要以下顺序:1.问题,2.接受答案3.根据
时间戳
的其他答案。我怎么做?通过加入,如图所示在另一个问题的答案中。或者更改您的数据,使答案中有一列显示它已被接受。或者将问题和答案保留在单独的表中;这似乎是问题的根源。是的,在排序之前,按顺序使用变量会使其取决于行最初读取的顺序。这就是我强调我的解决方案的原因之一只适用于您当前的简单案例,而不一定适用于更复杂的实际案例。我建议您加入。并向我们展示您的真实查询和真实模式(包括索引)因此,我们可以向您保证,它将是有效的,或者建议您对索引/查询进行更改。该连接假定链接是另一种方式。这是有效的(如果问题的类型设置为1!):
从mytable t left中选择t.*在t.type=1和tquestion上加入mytable tquestion.acceptedanswerid=t.id按t.type排序,tquestion.id不为null desc,t.timestamp
但可以在acceptedanswerid上使用索引否,它可以阻止它在问题是接受答案时尝试查找。但如果删除它,则不会更改结果anks,+1…但事实上,您的解决方案是,我在问题中提到,我不想将表本身连接起来。因为其他表上有四个连接,添加一个新连接似乎不受限制。“似乎不受限制”-为什么?只要以中间结果集快速变小的方式安排联接。好的,让我比较一下使用
join
和使用
if
的性能(如上面的答案)我会告诉你为什么我说加入是不受欢迎的。对于诚实的人来说,没有太大的区别。对于1000个请求,你的解决方案花了4.6秒,上面的解决方案花了3.2秒。无论如何,好的,谢谢,最后我得出结论,在这种情况下使用加入是最好的选择。但是你的ta有一个大问题ble结构。我认为不可能编写一个查询来插入一个问题。为什么?因为我们不能用它的
id
值完全填充
相关的
值。我们可以吗?如何?