2017-08-30 82 views
0

没有任何培训(和聋)我开发了一个城镇门户系统,但我放弃了特定的选择语句。Mysql select if else和order by statement

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

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

无论选择在哪里townid =“townB”或WHERE townid IN(“townB”)能够处理3极限问题,我需要三个结果,即使只有2第1项为B镇

+0

没有经过正规的培训,甚至研究生说没有多少毕业生能达到什么我做了,但没有正式的训练,我只知道我所学到的自己,也最有可能大量的“非常容易”的事情,我不不知道。 (我从来没有放弃,搜索和搜索,并尝试,直到我找到一个解决方案,但这一个......) –

+1

虽然我无法回答任何形式的残疾可能提供的障碍,像我自己,我怀疑只有在这里的少数人已经接受过任何正式的培训。 – Strawberry

+0

没有人可以在现实生活中提问 - 这是我的障碍,虽然很容易上网,但我几乎从不这样做,因为我相信自己在做和学习自己。 (Grrr我写的一些代码可能比这个更难20倍,但是......) –

回答

1

你在提供的示例和您的查询中几乎完美。你需要改变的唯一的事情就是通过find-in-set子句对DESCENDING进行排序。

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

find_in_set()将根据找到的东西(1)或不(0)返回1或0。所以你是先找到那些没有找到的人,然后找到。你想要相反。因此,即使你有99个项目,并且在几天的时间内均匀分布在每个城镇A,B和C上,在FIND_IN_SET上具有“DESC”结束顺序将会说给我所有'townA'记录,然后之后的其他人。那么,在每组FOUND(或NOT)记录中,按降序排列它们。

您的查询实际上只是一个“DESC”子句。

+0

两个DESC子句。 http://rextester.com/RBXBQL81555,并在set中查找1,0分析。 – xQbert

+0

非常感谢你。我很多次坐了好几个小时甚至几天才能得到像我想要的东西,但是这个更棒了我嘿嘿(我实际上构建了一个系统,根据我所知,但是在我没有获得任何东西的情况下,这个系统根本不存在$ 1,但hehehe) –

+0

Damnit。我在整个系统中进行了搜索和替换,除了“开发”网站之外,它改变了所有内容,所以当我检查了为什么我发现它实际上包含了DESC但我放弃DESC对于现场城镇门户来说并不重要。 –

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

谢谢你的代码片段,这可能会提供一些即时的帮助。通过展示*为什么*这是一个很好的解决方案,对未来的读者会有更好的解决方案,这将为它的教育价值提供一个合适的解释[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的问题。请编辑您的答案以添加解释,并指出适用的限制和假设。 –