Php 在具有多个同名项的表中选择特定id

Php 在具有多个同名项的表中选择特定id,php,sql,Php,Sql,我想知道是否有一种简单的方法可以从具有多行相同名称但不同版本ID的表中选择一行。 我使用的是一个大表(~12k行),其中包含id、名称、版本id等信息。对于每个条目,有几行具有相同的“名称”,并且它们都包含不同的版本id,最多24行。但是,有些条目只能进入21。我试图将版本id调用为21,但最近的130个条目只有版本id 23和24。 我没有制作这个表,而且我需要检查和更改每一行的版本id,这将是非常繁琐和漫长的,所以我来问是否有一种简单的方法来检查一行是否有版本id 24,如果没有,则使用版本

我想知道是否有一种简单的方法可以从具有多行相同名称但不同版本ID的表中选择一行。 我使用的是一个大表(~12k行),其中包含id、名称、版本id等信息。对于每个条目,有几行具有相同的“名称”,并且它们都包含不同的版本id,最多24行。但是,有些条目只能进入21。我试图将版本id调用为21,但最近的130个条目只有版本id 23和24。 我没有制作这个表,而且我需要检查和更改每一行的版本id,这将是非常繁琐和漫长的,所以我来问是否有一种简单的方法来检查一行是否有版本id 24,如果没有,则使用版本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
选择pokemon.id、pokemon\u species\u flavor\u text.flavor\u text、pokemon\u species\u name.gen属、pokemon\u species\u name.name、GROUP\u CONCAT(type\u names.name)
来自口袋妖怪、口袋妖怪种类、味道、口袋妖怪种类、类型、口袋妖怪类型
其中pokemon.species\u id=pokemon\u species\u flavor\u text.species\u id
和pokemon.species\u id=pokemon\u species\u name.pokemon\u species\u id
和pokemon_types.pokemon_id=pokemon.id
和口袋妖怪_types.type_id=type_names.type_id
和口袋妖怪种类风味文本版本id=21

而pokemon.id获取最新版本的典型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
                 );
这句话的意思是:“从表中获取所有行,其中没有具有相同名称和更高版本号的行”。这是一种复杂(但足够准确)的说法:“获取具有最高版本号的行”


这将很好地利用大多数数据库的
表(名称、版本)
上的索引。

您能发布表结构吗?也许还有5-6条记录的示例,这样我就可以确切地知道我在使用什么,我希望能为您整理一些东西。:)我的理解是,您希望每一行的version_id不是24而是21?是的,首先请提供表的结构。另一方面,我认为您需要的是SQL JOIN,您可以创建一个子查询,该子查询按名称分组并获取最大值(版本),然后将原始表连接到该表,并使用最大值(版本)选择您想要的行。我不能给你一个例子,除非你发布表结构,但这应该是可行的。我添加了pokemon_species_flavor_文本表的结构,还添加了我当前的SQL。它当前只选择版本号为21的所有行,而有些记录没有。还有,很抱歉我花了这么长时间才回复。我不确定我是否能做到这一点,因为我一次要拉多少东西。或者如果可能的话我会怎么做。我试图一次提取多条记录,我不知道在不存在的地方是否可以这样做。@KruSuPhy。这个答案的动机是“这是我试图从中选择版本id的表的外观。”如果您真正的意思是“查询结果”而不是表,那么您需要在子查询中重复连接和逻辑。