我在尝试编写SQL查询时遇到了一些麻烦。我有listings
的表格,现在我想在这里做的就是让已经付款的商家信息显示在结果的顶部。
所以说我在省页面上,省ID是23,我需要制作upgrade_province
='是'和upgrade_status
='付费'和id_province
的商家信息='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
='是'
答案 0 :(得分:3)
您可以在ORDER BY子句中使用任意表达式。布尔值true / false值将被视为“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并且会降低。
答案 1 :(得分:0)
如果我理解他想要的结果,Marc B提供的答案是不合适的。指定多个order by子句会导致第一个碰撞的二次排序,依此类推。
我对这个问题的理解是,有两组不同的东西需要以不同的方式排序。
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
注意:你否定联盟第二部分的方式可能需要将ands更改为ors,具体取决于你想要什么。
无论哪种方式指向的是独立选择两个不同的集合并对它们进行排序。类似的东西也可以在应用程序级别上完成,发出多个查询并让应用程序根据需要对其进行排序。