【问题标题】:MySQL Select show specific column values firstMySQL Select 首先显示特定的列值
【发布时间】:2016-10-26 12:52:48
【问题描述】:

我有一个包含大约 300 万行的表,其中包含城市、城市所在的国家和一些其他数据。

我想检索例如有限的行,其中城市名称以某个字符串开头,但首先列出位于特定国家/地区的那些。

我尝试按 country "us" 对它们进行排序,这非常慢,因为服务器必须在应用限制之前对所有找到的行进行排序。

现在我想出了以下说法:

(SELECT * FROM cities WHERE city LIKE "ab%" AND country = "at" LIMIT 5)
UNION
(SELECT * FROM cities WHERE city LIKE "ab%" LIMIT 5)
LIMIT 5

任何前缀长度都非常快,但看起来有点脏。

有没有更有效的方法来做到这一点?

【问题讨论】:

  • 我认为这已经很好了。
  • 我不遵循查询的逻辑。另外,当您已经只有 10 条记录时,为什么还要将 LIMIT 5 应用到外部?
  • @TimBiegeleisen 因为他只希望最终结果中有 5 行。如果at 的行数少于 5 行,他想从其他国家填补剩余的空位。
  • 很好的分析,我不会想到这一点。
  • @TimBiegeleisen 正如 Barmar 所说,因为结果我只想要 5 行。在我得到最多有 10 行的结果后,我可以手动执行此操作,但我认为服务器会更快地执行此操作,并且我会节省一点带宽。然而这并不重要。

标签: mysql sql select sql-order-by


【解决方案1】:
select top 5 *
, case when country = 'ab' then 1 
  else 0 end as rnk 
from cities
where lower(city) like 'ab%' 
or country = 'ab'
order by rnk desc;

【讨论】:

  • 这不是 MySQL。无论如何,这个查询仍然需要服务器对结果进行排序,再次,表中有这么多行真的很慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多