MySQL-我应该使用什么连接?2个表,成员数量不同

MySQL-我应该使用什么连接?2个表,成员数量不同,mysql,join,Mysql,Join,所以我有两张桌子: -char(保存有关玩家的信息) -特殊(这是一个顶级暴徒的排名,因此此表中的每一行记录了杀死暴徒的所有玩家和总时间) 以下是我写的总结: ################## ## table char: ## ################# `char_id` - int(12) auto increment - primary key `type` - varchar(18) `color` - varchar(16) -----------------------

所以我有两张桌子: -char(保存有关玩家的信息) -特殊(这是一个顶级暴徒的排名,因此此表中的每一行记录了杀死暴徒的所有玩家和总时间)

以下是我写的总结:

##################
## table char: ##
#################
`char_id` - int(12) auto increment - primary key
`type` - varchar(18)
`color` - varchar(16)
---------------------------------------------------
#####################
## table special: ##
#####################
`id` - auto increment - primary key - just for keeping a number of events
`name` - varchar(24)
`time` - int(12) - the time the char's spent to kill the mob
`member1_id`- here is the char_id, it goes from 1 to 20 (until member20_id)
its a int(12), default is '0', so if there's only 3 members i would have something like:
`member1_id` = 1111111
`member2_id` = 2222222
`member3_id` = 1113123
`member4_id` = 0 (same for the rest)
---------------------------------------------------
我想显示member1\u id、member2\u id、memberN\u id(提醒:一些值在member\u id中有0,因为没有播放器,所以没有数据显示)中的每个字符,并按时间顺序排列

下面是一个例子:

Mob rank:

1 - Name: XYZ Guild - Time: 3 minutes
Member 1: 1111111 - Type: soldier - Color: blue
Member 2: 2222222 - Type: soldier - Color: red

2- Name: The FOO Guild - Time: 19 minutes
Member 1: 238381 - Type: Noob - Color: green
Member 2: 4444444 - Type: soldier - Color: red
Member 3: 549595 - Type: soldier - Color: green
主要是关于我应该使用的连接类型,我有点困惑,我怎么只能从member_id不是0的地方获取数据,还可以从SPECIAL获取时间顺序


非常感谢

您的数据库设计有问题。表“特殊”应为两个表,“特殊”和“特殊成员”。“特殊”应包含“id”、“名称”和“时间”列。“特殊成员”应该有“特殊id”、“成员id”和可选的“成员顺序”列(如果重要的话,是谁的编号1、编号2等)和“id”自动编号列

有了这个规范化的结构,您的查询将变得很容易


如果不进行规范化,您将需要使用一个重复20次并联合在一起的内部联接。

我认为您需要重新考虑您的表结构。从长远来看,拥有成员1、成员2、成员3、成员4只会带来更多的问题。尤其是当您试图关联数据时

我建议你把这张桌子照原样拿着

保留“特殊”表,但将成员移动到其自己的表中,并通过id将其与特殊表关联

所以对于会员,你会

特别身份证,会员


现在,您可以使用内部联接并获取所需的所有数据。

那么我将使用左联接?然后我可以制作脚本…但不会更昂贵/更慢,因为必须搜索整个特殊_成员以获得相同的id?对于规范化结构,您将使用所有三个表(char、special、special_成员)以及内部连接(或仅普通连接)来连接它们。这是最简单、最快、最“正确”的方法。只要在连接的字段上有索引,就会很快完成。如果不进行规范化,则仍将在两个表之间使用内部联接,但必须重复查询20次(添加另一个表时重复21次,之后添加另一个表时重复22次)。您可以将20个查询合并为一个查询,并使用UNION分隔它们。此外,您可能应该使用NULL而不是0。