没有任何培训(和聋),我开发了一个城镇门户系统,但我放弃了特定的选择声明。
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;
目标是
换句话说,小镇首先按日期顺序选择他自己的OWN文章,限制为3,ELSE从任何其他城镇按日期顺序选择限制3或剩余的限制3。
不选择WHERE townid
=' townB'或者townid
IN(' townB')可以处理3限制问题,我需要三个结果,即使B组只有1个条目中的一个
答案 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;