MySQL CASE不适用于使用两列的ORDERY BY

时间:2018-04-08 15:55:44

标签: mysql sql

我想使用以下SQL:

SELECT * FROM Data WHERE tid=1 ORDER BY CASE WHEN round=0 THEN date ELSE round, date END ASC

但由于round, date位,它无法正常工作。如果我将该位round设置为{1}},则可以正常工作但两者都没有。

如果round=0,那么我希望能够先rounddate进行升序排序,然后round。这可能吗?

我想要实现的是一个排序的行数组,首先按date排序,然后round秒排序。但是,如果round为零,那么我只希望该行出现在该记录适合的日期之间,即使它的值为var slideIndex = 0; showSlides(); function showSlides() { var slides = document.getElementsByClassName("mySlides"); var dots = document.getElementsByClassName("dot"); for (var i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } slideIndex++; if (slideIndex > slides.length) { slideIndex = 1; } for (var i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" activeDot", ""); } slides[slideIndex - 1].style.display = "block"; dots[slideIndex - 1].className += " activeDot"; } function dotClickHandler(e) { clearInterval(intervalId); var activeDotIndex = this.getAttribute("slideDot"); slideIndex = activeDotIndex - 1; showSlides(); intervalId = setInterval(showSlides, 3000); } var dotNode = document.getElementsByClassName("dot"); for (var i=0;i<dotNode.length;i++) { dotNode[i].addEventListener("click", dotClickHandler); } var intervalId = setInterval(showSlides, 3000);

2 个答案:

答案 0 :(得分:2)

case 表达式只返回一个值。如果您想首先使用round = 0行,那么您可以执行以下操作:

ORDER BY (CASE WHEN round = 0 THEN 1 ELSE 2 END),
         round, date

这可以缩短为:

ORDER BY (round = 0) DESC, round, date

但是,我并非100%确定这是你真正想要的。

如果round只有两个值,那么您的问题会更有意义。在这种情况下,您确实希望先按date排序:

ORDER BY date, round;

然而,这是对数据值的看法。

答案 1 :(得分:1)

如果每列一个

,可能会使用几种情况
  SELECT * 
  FROM Data 
  WHERE tid=1 
  ORDER BY ( CASE WHEN round= 0  THEN date ELSE round  END) ASC , 
           ( CASE WHEN round= 0  THEN NULL  ELSE date  END) ASC