【问题标题】:MySql search two columns same table sort by first columMySql搜索两列同一张表按第一列排序
【发布时间】:2020-01-17 14:55:39
【问题描述】:

如果我有这样的表,这可能是一个简单的 SQL 查询:

books(
    id       int,
    title    varchar (255),
    description mediumtext
)

总结:我需要搜索输入“术语”的标题和描述,但首先按对我来说排名更高的标题匹配对结果进行排序,然后根据描述搜索找到的结果对结果进行排序。

详细信息:我需要在按标题排序的标题列中搜索“术语”,然后搜索描述并按标题对其结果进行排序,然后将搜索标题的结果与搜索描述的结果结合起来,但保留第一次搜索顶部的标题。

查询步骤:

result 1 = search title for terms sorted by title
result 2 = search description for terms sorted by title
result 3 = merge result 1, result 2 (union)

【问题讨论】:

  • 高分分数在哪里?
  • 你真正使用的是什么数据库,MySQL 还是 SQL Server?

标签: mysql sql


【解决方案1】:

您需要在ORDER BY 中使用CASE 语句首先对标题中的结果进行排序,然后对描述中的结果进行排序,然后按title 对每个组进行排序:

select * from books
where title like '%search%' or description like '%search%'
order by 
  case
    when title like '%search%' then 1
    when description like '%search%' then 2
  end, title

由于您只标记了 MySql,因此您可以更简单地编写相同的查询:

select * from books
where title like '%search%' or description like '%search%'
order by title like '%search%' desc, title

【讨论】:

  • 第一个查询有效,而第二个给出了 mysql 错误,我正在使用 mysql。
  • 是 MySql 还是 SQL Server?
  • 如果是 MySql 则查询运行良好:db-fiddle.com/f/iL4DxA17V4sWAjw1AAr7D9/0。如果是 SQL Server,则不是。
  • 不知道是什么错误但它是mysql Ver 14.14 Distrib 5.1.34, for Win32 (ia32)
  • 好的,没问题,我将使用第一个查询,因为它有效,我只是想我应该告诉你。
【解决方案2】:

您可以在order by 中使用表达式。所以:

order by (case when title like concat('%', @search_term, '%') then 1 else 2 end),
         (case when description like concat('%', @search_term, '%') then 1 else 2 end)

在 MySQL 中,这可以简化为:

order by (title like concat('%', @search_term, '%')) desc,
         (description like concat('%', @search_term, '%')) desc

【讨论】:

  • @daliaessam。 . .为什么?你不知道怎么写select/from?我很好奇你为什么不喜欢这个答案,这个答案比另一个答案早几分钟发布。
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多