我想知道是否有一种简单的方法可以从具有多个同名行但不同版本ID的表中选择一行。 我正在使用一个大表(~12k行),其中包含id,name,version_id等信息。每个条目有几行具有相同的“名称”,它们都包含不同的version_id,最多24个。但是,有些条目只有21个。我试图将版本ID调用为21,但最多最近130个条目只有version_id 23和24。 我没有制作这个表,并且通过并更改我需要的每一行的版本ID是非常繁琐和漫长的,所以我来问是否有一种简单的方法来检查一行是否有一个version_id 24,如果不是,则使用version_id 21(因为所有条目都有一个或另一个。有些从1-21开始,有些从1-24开始,有些是23-24。没有例外)
如果完全无法通过SQL执行此操作,我只是在每个条目中运行一个循环来检查版本ID,我觉得这会很难达到性能。
以下是我试图从中选择版本ID的表格。有些记录只有21,有些记录从23开始。
另外,这是我当前的sql:
SELECT pokemon.id, pokemon_species_flavor_text.flavor_text, pokemon_species_names.genus, pokemon_species_names.name, GROUP_CONCAT(type_names.name)
FROM pokemon, pokemon_species_flavor_text, pokemon_species_names, type_names, pokemon_types
WHERE pokemon.species_id = pokemon_species_flavor_text.species_id
AND pokemon.species_id = pokemon_species_names.pokemon_species_id
AND pokemon_types.pokemon_id = pokemon.id
AND pokemon_types.type_id = type_names.type_id
AND pokemon_species_flavor_text.version_id =21
AND pokemon.id <2000
AND pokemon_species_names.local_language_id =9
AND type_names.local_language_id =9
GROUP BY pokemon.id, pokemon_species_names.name
我不确定我是否可以在那里使用WHERE NOT EXISTS,因为我试图同时拉出这么多不同的东西。
答案 0 :(得分:0)
获取最新版本的典型SQL方法是使用not exists
:
select t.*
from table t
where not exists (select 1
from table t2
where t2.name = t.name and
t2.version > t.version
);
这说的是:&#34;从表中获取所有行,其中没有具有相同名称和更高版本号的行&#34;。一种令人费解(但足够准确)的说法:&#34;给我一个版本号最高的行&#34;。
对于大多数数据库,这将充分利用table(name, version)
上的索引。