我需要从表中选择所有vip并按rand排序,然后添加按日期排序的其他数据 . 在第一个子查询中一切正常,但在第二个_1376155中不起作用 . 我知道UNION子查询中的ORDER BY子句在没有LIMIT的情况下被忽略(但是由rand()工作的顺序),但我需要从所有查询(1 2)限制,而不是从子查询
SELECT * FROM
(
select *,DATE_FORMAT(spa_date,"%e %M %Y") as spa_date_out
from spa join city using (city_id)
where spa_vip=1
order by RAND()
) as A
UNION
(
select *,DATE_FORMAT(spa_date,"%e %M %Y") as spa_date_out
from spa join city using (city_id)
where spa_vip=0
order by spa_date DESC )
limit 10,10
问题:
我需要选择所有spa_id,其中spa_vip = 1并按RAND()排序,然后我需要选择所有spa_id,其中spa_vip = 0并按spa_date排序,联合这2个子查询并选择限制为0,10的数据等等用于页面查看
1 回答
我不确定这些是否能回答你的问题,因为我没有看到任何问题 .
如果您问的问题是 "Why am I observing this behavior?" ,请参阅下面的答案 .
如果你问, "What changes do I need to make to my statement so MySQL returns rows in a particular order?" ,也请看下面的答案 .
如果您要求 "What is the exact statement do I need to run?" ,我们're really just guessing, because it'不清楚您希望返回的行的顺序,那么's no clear specification or description, there'没有示例数据或示例输出,或者应首先返回哪些行的基本原理 .
MySQL可以按照它选择的任何顺序自由返回行,因为最外层查询中没有
ORDER BY
子句 . (MySQL实际上可以忽略内联视图查询中的ORDER BY
子句,并且符合ANSI SQL标准的规范 . )为了保证查询返回的行将按特定顺序返回,请在 LIMIT 子句之前在外部查询上添加 ORDER BY 子句 .
请注意, UNION set运算符要求MySQL检查组合集中的"duplicate"行,并删除任何重复的行 .
如果您没有执行该操作的要求,则可以使用 UNION ALL set运算符代替 UNION .
在MySQL中,也可以省略
SELECT * FROM
语句的开头 .我可以提供“试试这个”示例SQL,但不知道你实际想要返回的行的顺序,我们只是猜测 . )
这是我对一个查询的猜测,该查询返回您期望的“顺序”中的行 .
我将使用
UNION ALL
set运算符显示:让's unpack that a little bit. There'的两个返回行的查询,
UNION ALL
set运算符将这两个集合组合成一个集合 . (如果您使用UNION
set运算符删除重复项的目的,可以通过使用UNION
替换此查询中的UNION ALL
来恢复该行为 . )ORDER BY
子句中的第一个表达式 spa_vip 首先从第一个集合中获取行...我们保证从第一个查询返回的所有行对于spa_vip都具有值1,而来自第二个查询的所有行都具有值0 .第二个表达式为第一个查询中的行返回
RAND()
,为第二个查询中的行返回常量 .第三个表达式为第一个查询中的所有行返回一个常量,为第二个查询中的行返回一个值 .
如果这是您期望返回的结果,那么同样的结果也可以通过如下语句返回: