当前位置: 首页 > 知识库问答 >
问题:

如何在mysql联合子查询中对数据进行排序?

许明朗
2023-03-14

我需要从表中选择所有的vip并按兰德排序,然后添加按日期排序的其他数据。在第一个子查询中,一切正常,但在第二个子查询中,spa_date DESC不起作用。我知道UNION子查询中的ORDER BY子句会被忽略而没有限制(但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

问题:
我需要选择spa_vip=1的所有spa_id并按RAND()排序,然后我需要选择spa_vip=0的所有spa_id并按spa_date排序,合并这2个子查询并为页面视图选择限制为0、10的数据,以此类推

共有1个答案

巫坚白
2023-03-14

我不确定这些回答了你的问题,因为我没有看到有人问任何问题。

如果你在问“为什么我在观察这种行为?”这个问题,请看下面我的回答。

如果您在问:“我需要对我的语句做哪些更改,以便MySQL以特定顺序返回行?”,也请参阅下面我的回答。

如果您问,“我需要运行的确切语句是什么?”,我们实际上只是猜测,因为不清楚您希望返回的行的顺序,没有明确的规范或描述,没有示例数据或示例输出,也没有应该首先返回哪些行的原理。

MySQL可以自由地以它选择的任何顺序返回行,因为在最外面的查询上没有order by子句。(MySQL实际上可以忽略内联视图查询中的order by子句,并在ANSI SQL标准的规范范围内。)

若要确保查询返回的行将以特定顺序返回,请在外部查询的limit子句之前添加order by子句。

请注意,unionset运算符要求MySQL检查组合集中的“重复”行,并删除任何重复行。

如果您不需要执行该操作,则可以使用UNION ALLset运算符来代替UNION

在MySQL中,还可以省略语句开头的select*from

我可以提供“试试这个”示例SQL,但由于不知道实际希望返回的行的顺序,我们只是猜测。)

下面是我对一个查询的猜测,该查询按照您所期望的“顺序”返回行。

我将使用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

让我们把它拆开一点。有两个查询返回行,UNION ALLset运算符将这两个集合合并为一个集合。(如果使用unionset运算符的目的是删除重复项,则可以通过将此查询中的unionall替换为union来恢复该行为。)

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
 类似资料:
  • 本文向大家介绍如何对MySQL联合查询计数?,包括了如何对MySQL联合查询计数?的使用技巧和注意事项,需要的朋友参考一下 要对联合进行计数,即获取UNION结果的计数,请使用以下语法- 为了理解上述语法,让我们创建两个带有一些记录的表。创建表的查询如下- 使用insert命令在表中插入一些记录。查询如下- 使用select语句显示表中的所有记录。查询如下- 以下是输出- 该查询创建第二个表。 使

  • 问题内容: 我想用UNION和limit进行查询。 我可以在mysql上解释该查询。 我在Elasticsearch上尝试过 http:// localhost:9200 / test / table / _search?pretty&source = {%22query%22:{%22dis_max%22:{%22queries%22:[{%22query%22:{%22match%22:{%2

  • 问题内容: 我在MySQL表中有一个列,其类型是,而另一列是类型。 我想按以下顺序获取所有表行: 首先排,按 最后一行,排序方式 在中间的所有其他行中,按 可以在1个查询中进行这种排序吗? 问题答案: 使用:

  • 问题内容: 我在SQLAlchemy中找不到此简单查询的解决方案示例。SQLAlchemy可以替换T-SQL ETL数据吗? 我将此连接用于Windows身份验证: 问题答案: 您需要的是多部分架构名称。如果您使用的是声明式,则可以使用并使用它来执行查询。由于您省略了表或模型定义,因此我将根据您的查询示例生成示例:

  • 有人知道为什么repository方法没有按照预期工作吗?多谢了。

  • flink流有多个数据流,然后我将这些数据流与org合并。阿帕奇。Flink。流式处理。api。数据流。DataStream#联合方法。然后,我得到了问题,数据流是无序的,我不能设置窗口来排序数据流中的数据。 在Apache Flink中对流的联合进行排序以识别用户会话 我得到了答案,但是com。利亚姆。学Flink。实例协会UnionStreamDemo。从未调用SortFunction#onT