【问题标题】:SQL show results for A column first then show results for B columnSQL 先显示 A 列的结果,然后显示 B 列的结果
【发布时间】:2019-03-05 16:10:17
【问题描述】:

我希望 SQL 首先显示/排序 name 列的结果,然后最后显示 description 列的结果。

当前 SQL 查询:

SELECT * FROM products WHERE (name LIKE '%$search_query%' OR description LIKE '%$search_query%') 

我尝试在最后添加order by name, description [ASC|DESC],但没有奏效。

用于优化搜索结果。如果在description 中找到某个单词,如果在name 列中也找到某个单词,它应该排在最后。

【问题讨论】:

  • 那么,name 中的单词排在第一位,description 中的单词排在第二位,namedescription 中的单词排在最后?

标签: mysql sql mariadb


【解决方案1】:

您可以在ORDER BY 中使用CASE 语句来确定名称 的优先级。在下面的示例中,名称匹配的所有结果都将排在第一位,因为 CASE 语句的计算结果为 1,而所有其他结果的计算结果为 2。

根据您的问题描述,我不确定您到底希望行为是什么,但您当然可以使用此技术创建更精细的案例来确定结果的优先级。

SELECT * 
FROM products 
WHERE (name LIKE '%$search_query%' OR description LIKE '%$search_query%') 
ORDER BY CASE WHEN name LIKE '%$search_query%' THEN 1 ELSE 2 END

【讨论】:

    【解决方案2】:

    如果你想要名字,最简单的order by是:

    order by (name like '%$search_query%') desc
    

    MySQL 将布尔值视为数字上下文中的数字,“1”表示真,“0”表示假。

    【讨论】:

      【解决方案3】:

      虽然这是未记录的,但当结果集由 UNION ALL 组合并且之后未排序时,它们会保持返回的顺序,因为 UNION ALL 只是将新结果添加到结果集的底部。这应该适合你:

      SELECT * FROM products
      WHERE name LIKE '%$search_query%' 
      UNION ALL
      SELECT * FROM products
      WHERE (description LIKE '%$search_query%' AND name NOT LIKE '%$search_query%') 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        相关资源
        最近更新 更多