【问题标题】:Bringing specific results to the front using one MySQL query使用一个 MySQL 查询将特定结果放在前面
【发布时间】:2010-06-08 08:37:35
【问题描述】:

我正在设置我的地理定位功能,该功能按名称顺序列出所有国家/地区。但是,大多数网站都将其设置在热门国家(如美国、英国、加拿大、澳大利亚)位于列表的最前面(显示在最前面而不是指定位置)。是否可以使用我已经运行以选择它们的相同 MySQL 查询来实现这一点?

SELECT * FROM `global_flags` ORDER BY `country`

在某个地方有更好的选择吗?也许可以在查询数据库后重新组织结果?我不想排除这些结果,然后在开头手动键入它们,因为那样会浪费文件中的更多空间。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    ORDER BY 子句中使用CASE 表达式,并为您希望首先出现的国家/地区分配特定值。

    例如

    SELECT * FROM global_flags
      ORDER BY (CASE WHEN country="United States" THEN 0 WHEN country="United Kingdom" THEN 1 ELSE 2 END), country;
    

    【讨论】:

    • 是的,这就像我的优先想法一样,除了它使自定义订单保持良好并与数据分开。有谁知道哪个可能表现更好?
    • 好吧,因为为 256 行表添加额外的列似乎添加了太多数据,所以我选择了这个:SELECT * FROM global_flags ORDER BY (CASE WHEN country = 'Australia' THEN 1 WHEN country = 'Canada' THEN 1 WHEN country = 'United Kingdom' THEN 1 WHEN country = 'United States' THEN 1 ELSE 2 END), country
    • @Frank:我相信您的解决方案会表现得更好,因为 CASE 必须在查询时逐行评估,而不是简单地对整数进行排序。如果要在多个查询中使用,您的解决方案还具有不必复制笨拙的 CASE 表达式的好处。
    • @animuson:我还没有测试过这个,但你也许可以将 CASE 表达式简化为:(CASE WHEN country IN ('Australia', 'Canada', 'United Kingdom', 'United States') THEN 1 ELSE 2 END)
    【解决方案2】:

    如果无法从列本身推测订单(在您的情况下,我认为您不能),您需要在表格中添加另一列(或通过视图添加)以提供排序顺序。

    例如,您可以有一个 int 类型的优先级列。对于大多数行,它是空的,对于那些你想要的,它可能是 1。假设你想要美国和英国作为你的第一行,其余的按字母顺序:

    SELECT * FROM global_flags ORDER BY priority DESC, country
    

    会将优先级较高的项目推到结果集的顶部。具有相同优先级的项目将按字母顺序排序。

    编辑:我的方法的缺点是您将 UI 内容添加到数据中。您始终可以将优先级(UI 事物)分离到其自己的表中,然后将 INNER JOIN 放入其中或创建视图。但也许VeeArr's answer 更好:它不会因 UI 问题而污染您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2017-05-29
      • 2021-04-24
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多