MySQL Select 首先显示特定的列值

Posted

技术标签:

【中文标题】MySQL Select 首先显示特定的列值【英文标题】:MySQL Select show specific column values first 【发布时间】: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 行的结果后,我可以手动执行此操作,但我认为服务器会更快地执行此操作,并且我会节省一点带宽。然而这并不重要。 【参考方案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。无论如何,这个查询仍然需要服务器对结果进行排序,再次,表中有这么多行真的很慢。

以上是关于MySQL Select 首先显示特定的列值的主要内容,如果未能解决你的问题,请参考以下文章

在另一个表的 select 子句中使用一个表中的列值

Mysql-DQL

特定类型的查询

MySQL在针对Store Locator-Google Maps App的Group By查询中选择错误的列值

MySQL Select ID 出现在具有多个特定值的列的不同行上

Rails/SQL:如何在特定 id 上查找最频繁的列值