引言:
当使用多个 SELECT 语句结合 UNION 查询数据时,需要在保持每个查询各自独立性的同时,对结果进行合适的标题排序。
问题:
一个场景是,三个 SELECT 查询根据网站搜索的不同距离标准检索数据。第一个查询检索精确地点搜索的数据,第二个查询检索 5 公里以内的数据,第三个查询检索 5-15 公里以内的数据。查询结果使用 UNION 结合并显示在一个带有标题的页面上。但是,用户希望根据 id 或 add_date 对每个标题下的结果进行排序。
解决方案:
为实现此目的,MySQL 为每个 SELECT 语句引入一个名为“rank”的伪列。此伪列可用于在应用其他排序标准之前对结果进行初始排序。以下修改后的查询演示了这种方法:
<code class="language-sql">SELECT * FROM ( SELECT 1 AS Rank, id, add_date FROM Table UNION ALL SELECT 2 AS Rank, id, add_date FROM Table WHERE distance < 5 UNION ALL SELECT 3 AS Rank, id, add_date FROM Table WHERE distance BETWEEN 5 AND 15 ) AS RankedResults ORDER BY Rank ASC, id DESC, add_date DESC;</code>
解释:
伪列“Rank”: 在每个 SELECT 语句中,都引入一个名为“Rank”的伪列,并为其分配唯一值(1、2 和 3)。此列表示结果的顺序或分组。
按“Rank”进行初始排序: UNION 结果最初按“Rank”列升序排序。这确保结果根据其各自的标题(“精确搜索结果”、“5 公里以内结果”和“5-15 公里以内结果”)进行分组。
按“id”和“add_date”进行额外排序: 在每个分组(由“Rank”确定)内,结果进一步按“id”和“add_date”降序排序。
注意:
此方法使用 UNION ALL 操作,该操作在组合结果中包含重复行。如果不需要重复行,则可以使用 UNION 操作,该操作将消除重复项。
以上是如何对 MySQL UNION 查询的不同部分中的结果进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!