如何对 mysql UNION 子查询中的数据进行排序?
How to sort data in mysql UNION subquery?
我需要 select 来自 table 的所有 vip 并按随机数排序,然后添加按日期排序的其他数据。在第一个子查询中一切正常,但在第二个 order by spa_date DESC 中不起作用。我知道 UNION 子查询中的 ORDER BY 子句在没有 LIMIT 的情况下被忽略(但 order by 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
问题:
我需要 select 所有 spa_id 其中 spa_vip=1 并按 RAND() 排序,然后我需要 select 所有 spa_id 其中 spa_vip=0 并按 spa_date 排序,合并这 2 个子查询和 select 数据,限制为 0,10 等等,页面视图
我不确定这是否能回答您的问题,因为我没有看到有人提出任何问题。
如果你问的是"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?",我们实际上只是在猜测,因为不清楚您希望行 return 的顺序,没有明确的规范或描述,没有示例数据或示例输出,也没有关于哪些行应该首先 returned 的基本原理。
MySQL 可以按它选择的任何顺序自由 return 行,因为最外层查询没有 ORDER BY
子句。 (MySQL 实际上可以忽略内联视图查询中的 ORDER BY
子句,并且符合 ANSI SQL 标准的规范。)
要保证查询 return 的行将按特定顺序 return 编辑,请添加 ORDER BY
子句在外部查询中,在 LIMIT
子句之前。
请注意,UNION
集运算符需要 MySQL 检查组合集中的 "duplicate" 行,并删除所有重复行.
如果您不需要执行该操作,您可以使用 UNION ALL
集合运算符代替 UNION
.
在MySQL中,也可以省略语句开头的SELECT * FROM
。
我可以提供 "try this" 示例 SQL,但不知道您实际想要行 return 的顺序,我们只是猜测。)
这是我对您期望的 "order" 行中 return 行的查询的猜测。
我将使用 UNION ALL
集合运算符来展示它:
(
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
让我们稍微解压一下。有两个查询 return 行,UNION ALL
集合运算符将这两个集合组合成一个集合。 (如果您的目的是使用 UNION
设置运算符来删除重复项,则可以通过将此查询中的 UNION ALL
替换为 UNION
来恢复该行为。)
ORDER BY
子句中的第一个表达式 spa_vip
首先获取第一组中的行...我们保证所有行return来自第一个查询的 spa_vip 的值为 1,第二个查询的所有行的值为 0。
第二个表达式 returns RAND()
表示来自第一个查询的行,一个常量表示来自第二个查询的行。
第三个表达式return是第一个查询中所有行的常量,第二个查询中行的值。
如果这是您期望 returned 的结果,同样的结果也可以通过这样的语句 returned:
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
我需要 select 来自 table 的所有 vip 并按随机数排序,然后添加按日期排序的其他数据。在第一个子查询中一切正常,但在第二个 order by spa_date DESC 中不起作用。我知道 UNION 子查询中的 ORDER BY 子句在没有 LIMIT 的情况下被忽略(但 order by 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
问题:
我需要 select 所有 spa_id 其中 spa_vip=1 并按 RAND() 排序,然后我需要 select 所有 spa_id 其中 spa_vip=0 并按 spa_date 排序,合并这 2 个子查询和 select 数据,限制为 0,10 等等,页面视图
我不确定这是否能回答您的问题,因为我没有看到有人提出任何问题。
如果你问的是"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?",我们实际上只是在猜测,因为不清楚您希望行 return 的顺序,没有明确的规范或描述,没有示例数据或示例输出,也没有关于哪些行应该首先 returned 的基本原理。
MySQL 可以按它选择的任何顺序自由 return 行,因为最外层查询没有 ORDER BY
子句。 (MySQL 实际上可以忽略内联视图查询中的 ORDER BY
子句,并且符合 ANSI SQL 标准的规范。)
要保证查询 return 的行将按特定顺序 return 编辑,请添加 ORDER BY
子句在外部查询中,在 LIMIT
子句之前。
请注意,UNION
集运算符需要 MySQL 检查组合集中的 "duplicate" 行,并删除所有重复行.
如果您不需要执行该操作,您可以使用 UNION ALL
集合运算符代替 UNION
.
在MySQL中,也可以省略语句开头的SELECT * FROM
。
我可以提供 "try this" 示例 SQL,但不知道您实际想要行 return 的顺序,我们只是猜测。)
这是我对您期望的 "order" 行中 return 行的查询的猜测。
我将使用 UNION ALL
集合运算符来展示它:
(
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
让我们稍微解压一下。有两个查询 return 行,UNION ALL
集合运算符将这两个集合组合成一个集合。 (如果您的目的是使用 UNION
设置运算符来删除重复项,则可以通过将此查询中的 UNION ALL
替换为 UNION
来恢复该行为。)
ORDER BY
子句中的第一个表达式 spa_vip
首先获取第一组中的行...我们保证所有行return来自第一个查询的 spa_vip 的值为 1,第二个查询的所有行的值为 0。
第二个表达式 returns RAND()
表示来自第一个查询的行,一个常量表示来自第二个查询的行。
第三个表达式return是第一个查询中所有行的常量,第二个查询中行的值。
如果这是您期望 returned 的结果,同样的结果也可以通过这样的语句 returned:
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