标题可能无法完全解释我的问题,但我不确定如何在标题中,所以我会在这里解释更多。
我有一张桌子,上面有关于乐队/表演的各种信息,我有一个浏览页面,显示某个地区的所有行为等。每个行为都可以说他们是否想要饮料/食物/住宿/额外/旅行支付。在浏览页面上,我还有一个排序功能,我希望能够根据行为想要付出的结果对结果进行排序。
每个选项都有五个复选框,但是当我仅检查旅行时,如果我想要只需要在顶部支付旅行费用的行为,那么旅行以及其他旅行的行为都在顶部。
目前,排序功能从浏览时的原始查询开始:
SELECT * FROM acts
然后sort函数根据已检查的内容追加ORDER BY语句:
SELECT * FROM acts ORDER BY travel DESC
或者如果选择了多个:
SELECT * FROM acts ORDER BY travel DESC, food DESC
但正如我所说,这并没有正确排序(所以对于第二顺序的查询,我想要一个只想要旅行和食物在顶部的行为)。
我还尝试在ORDER BY ASC中添加未选择的选项,但这并没有帮助。
数据库中的列也包含" yes"或"不"这就是为什么我希望他们在DESC上使用DESC的原因。我没有制作数据库,也无法更改。
感谢您的帮助。
编辑:你可以在这里看到我的意思:http://www.acthook.com/browse.php如果你将浏览框留空并单击浏览以获得所有结果,然后勾选旅行并点击排序,有一个行为只想要一路走下去第一页。答案 0 :(得分:0)
我不确定这是否正确(问题出在数据库结构中),但尝试这样的事情>
仅检查旅行:
SELECT * FROM table
WHERE travel = yes
and food = no
and .. = no
UNION SELECT * FROM table
编辑: 或者类似的东西 选择*来自旅行的订单,食品DESC
答案 1 :(得分:0)
哦,我明白了,谢谢你的例子,没有:)这不是很清楚:) 那么你应该有这样的东西:
SELECT * FROM acts ORDER BY travel DESC, food ASC, accomodation ASC, drink ASC, extra_fee ASC;
如果用户也点击食物:
SELECT * FROM acts ORDER BY travel DESC, food ASC, accomodation ASC, drink ASC, extra_fee ASC;
或者,如果他只点击食物:
SELECT * FROM acts ORDER BY food DESC, travel ASC, accomodation ASC, drink ASC, extra_fee ASC;
正如您在此处所见,订单子句中字段的顺序已更改。你也必须注意这一点。
为了构建查询,您可以执行以下操作:
$allowedOrderBy = array('travel','food','dring','extra_fee');//etc
$foundOrderBy = array();
foreach ($_POST as $orderBy) {
if (in_array($orderBy, $allowedOrderBy)) {
$foundOrderBy[] = $orderBy;
}
}
$notFoundOrderBy = array_diff($allowedOrderBy, $foundOrderBy);
$orderByStr = implode(' DESC,', $foundOrderBy).' DESC, ';
$orderByStr.= implode(' ASC,', $notFoundOrderBy). 'ASC';