用if else和order by语句选择mysql

时间:2017-08-30 12:52:37

标签: mysql if-statement select

没有任何培训(和聋),我开发了一个城镇门户系统,但我放弃了特定的选择声明。

SELECT `id` FROM `test` ORDER BY FIND_IN_SET(`townid`,'townA'), date DESC LIMIT 3 ;

CREATE TABLE `test` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `townid` varchar(10) NOT NULL,
  `data` text NOT NULL,
  `date` date NOT NULL DEFAULT '2017-08-30'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `test` (`id`, `townid`, `data`, `date`) VALUES
(1, 'townB', 'Data for Town B', '2017-08-29'),
(2, 'townA', 'Data for Town A', '2017-08-28'),
(3, 'townA', 'Data for Town A', '2017-08-27'),
(4, 'townA', 'Data for Town A', '2017-08-26'),
(5, 'townC', 'Data for Town C', '2017-08-25'),
(6, 'townB', 'Data for Town B', '2017-08-24');

ALTER TABLE `test`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `test`
  MODIFY `id` int(5) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;COMMIT;

目标是

  • townA选择ID 2,3和4
  • townB选择ID 1,6和2
  • townC选择ID 5,1和2

换句话说,小镇首先按日期顺序选择他自己的OWN文章,限制为3,ELSE从任何其他城镇按日期顺序选择限制3或剩余的限制3。

不选择WHERE townid =' townB'或者townid IN(' townB')可以处理3限制问题,我需要三个结果,即使B组只有1个条目中的一个

2 个答案:

答案 0 :(得分:1)

您提供的样本和查询几乎完美无缺。您需要更改的唯一内容是find-in-set子句到DESCENDING的顺序。

ORDER BY FIND_IN_SET(townid,'townA') DESC, date DESC

find_in_set()将根据被找到的东西(1)返回1或0或不返回0(0)。所以你是先找不到的,然后找到的。你想反过来。因此,即使您有99个项目,并且在几天的时间内在每个城镇A,B和C上均匀分配,在FIND_IN_SET上具有“DESC”结束顺序将首先告诉我所有'townA'记录,然后之后的其他人。然后,在每组FOUND(或NOT)记录中,按降序日期顺序对它们进行排序。

您的查询实际上只是一个“DESC”条款。

答案 1 :(得分:0)

SELECT * 
  FROM test 
 ORDER 
    BY townid = 'townc' DESC -- or 'towna' or 'townb'
     , date DESC
 LIMIT 3;