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 首先显示特定的列值的主要内容,如果未能解决你的问题,请参考以下文章
MySQL在针对Store Locator-Google Maps App的Group By查询中选择错误的列值