2012-01-11 18 views
3

我在尝试编写sql查询时遇到了一些问题。我有一张listings的表格,现在我所要做的就是使得已支付的列表显示在结果的顶部。通过已支付列表的mysql查询顺序

这么说我是省页和全省ID是23,我需要做的是有上市upgrade_province =“是”和upgrade_status =“支付”和 = '23' 显示为订购的第一批成果按日期排序,以及按日期排序的所有其他项目。如果upgrade_province ='是'并且upgrade_status ='未付费',那么它需要将该列表显示为正常列表。

继承人的表结构:

`id` int(11) NOT NULL auto_increment, 
`id_user` int(11) NOT NULL, 
`contact_email` varchar(255) NOT NULL, 
`price` varchar(255) NOT NULL, 
`title` varchar(255) NOT NULL, 
`title_slug` varchar(255) NOT NULL, 
`description` text NOT NULL, 
`id_province` int(11) NOT NULL, 
`id_city` int(11) NOT NULL, 
`map_address` varchar(255) NOT NULL, 
`id_type` int(11) NOT NULL, 
`id_contract` int(11) NOT NULL, 
`bedrooms` varchar(255) NOT NULL, 
`bathrooms` varchar(255) NOT NULL, 
`image_main` varchar(255) NOT NULL, 
`image_2` varchar(255) NOT NULL, 
`image_3` varchar(255) NOT NULL, 
`image_4` varchar(255) NOT NULL, 
`image_5` varchar(255) NOT NULL, 
`status` varchar(255) NOT NULL default 'Active', 
`upgrade_urgent` varchar(255) NOT NULL default 'no', 
`upgrade_city` varchar(255) NOT NULL default 'no', 
`upgrade_province` varchar(255) NOT NULL default 'no', 
`upgrade_price` varchar(255) NOT NULL, 
`upgrade_status` varchar(255) NOT NULL default 'unpaid', 
`num_views` int(11) NOT NULL default '0', 
`num_replies` int(11) NOT NULL default '0', 
`date_posted` int(11) NOT NULL, 
`date_upgrade` int(11) NOT NULL default '0', 
`mod_status` varchar(255) NOT NULL default 'approved', 

我似乎无法弄清楚如何我可以让它把未付广告为正常,即使它们的upgrade_province =“是”

回答

3

您可以随心所欲的使用ORDER BY子句中的表达式。布尔真/假值将得到视为“0”和“1”的整数能与ASC/DESC照常进行排序,所以

...rest of query... 
ORDER BY (upgrade_province='yes' and upgrade_status='paid' and id_province='23') DESC, 
    ... other order clauses ... 

其评估为TRUE的任何记录“和”序列将评估为'1',当订购DESC时将首先出现在结果中。任何出现错误的东西都会投射到0,并且会降低。

+0

+1在我之前完成。 – 2012-01-11 03:30:59

+0

正是我所期待的。 – scarhand 2012-01-11 03:52:57

0

如果我理解他的理想结果,那么Marc B提供的答案是不合适的。通过子句指定多个顺序会导致对第一个等的碰撞进行二级排序。

我对这个问题的理解是有两套不同的东西需要以不同方式排序。

另外order by子句不正确。他希望将其作为where子句的一部分,然后在确定集合后按日期排序。

我会建议尝试

select .. from table where (upgrade_province='yes' and upgrade_status='paid' and id_province='23') order by date desc 
union 
select .. from table where (upgrade_province!='yes' and upgrade_status!='paid' and id_province!='23') order by date desc 

注意:你否定工会的第二部分的方式可能需要对阿富汗国家发展战略改为口服补液盐取决于你想要什么。

无论哪种方式指向是独立选择两个不同的集合,并自行排序。类似的东西也可以在发布多个查询的应用程序级别上完成,并让应用程序根据需要对其进行分类。