mysql union 子查询_如何在mysql UNION子查询中对数据进行排序?

我不确定这些是否能回答你的问题,因为我没有看到任何问题 .

如果您问的问题是 "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运算符显示:

(

SELECT *,DATE_FORMAT(spa_date,"%e %M %Y") as spa_date_out

FROM spa

JOIN city USING (city_id)

WHERE spa_vip=1

)

UNION ALL

(

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_vip DESC

, IF(spa_vip=1,RAND(),0)

, IF(spa_vip=0,spa_date,NULL) DESC

LIMIT 10,10

让's unpack that a little bit. There'的两个返回行的查询, UNION ALL set运算符将这两个集合组合成一个集合 . (如果您使用 UNION set运算符删除重复项的目的,可以通过使用 UNION 替换此查询中的 UNION ALL 来恢复该行为 . )

ORDER BY 子句中的第一个表达式 spa_vip 首先从第一个集合中获取行...我们保证从第一个查询返回的所有行对于spa_vip都具有值1,而来自第二个查询的所有行都具有值0 .

第二个表达式为第一个查询中的行返回 RAND() ,为第二个查询中的行返回常量 .

第三个表达式为第一个查询中的所有行返回一个常量,为第二个查询中的行返回一个值 .

如果这是您期望返回的结果,那么同样的结果也可以通过如下语句返回:

SELECT *,DATE_FORMAT(spa_date,"%e %M %Y") as spa_date_out

FROM spa

JOIN city USING (city_id)

WHERE spa_vip IN (0,1)

ORDER

BY spa_vip DESC

, IF(spa_vip=1,RAND(),0)

, IF(spa_vip=0,spa_date,NULL) DESC

LIMIT 10,10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值