我正在制作一个非常简单的MMORPG的后端。我在PHP和MySQL工作我有以下表格:
characters
----------
id,charactername,country,server,guild,xp,level,etc..
guilds
------
id,guildname,country,server
我正在寻找的是一种从角色表中收集所有独特公会的方法,找出哪些不在公会表中并更新公会。棘手的部分似乎是同一个公会可以存在于不同的国家/服务器组合中。以下是有效公会条目的一些示例,表明它们不冲突:
21,"Hardworking Ogres","uk","development"
3151,"Hardworking Ogres","us","development"
231,"Hardworking Ogres","us","live"
所以我的guilds表在guildname,country和server上有一个唯一的索引 - 这很好用,所以我不会覆盖条目。我以前一直在将所有guild / country / server的DISTINCT转储从字符表转换为多维数组。然后从guilds表中转储现有公会/国家/服务器的列表。然后我运行一个类似于array_diff的函数来获取guilds表中不存在的唯一的列表,并运行INSERT查询来更新它。
我确信在MySQL中有一种更简单的方法可以返回guilds表中不存在的任何公会/国家/服务器组合的唯一列表,然后运行插入保存时间查询2个大量MySQL请求然后比较他们。我只是不知道接下来要去哪里看,所以我的问题是:有没有办法在MySQL中实现这个目标?
答案 0 :(得分:1)
SELECT DISTINCT
c.country, c.server, c.guild
FROM
characters AS c
WHERE
NOT EXISTS
( SELECT *
FROM guilds AS g
WHERE g.country = c.country
AND g.server = c.server
AND g.guildname = c.guild
) ;
在运行查询之前:
如果guilds
中的索引为(country, server, guildname)
,请在characters
上添加索引(不唯一),列的顺序相同。
答案 1 :(得分:1)
您可以使用简单的LEFT JOIN
并检查guilds.id
NULL
的位置:
SELECT DISTINCT
ch.country,
ch.server,
ch.guild
FROM
`characters` as `ch`
LEFT JOIN
`guilds` as `gu`
ON
(gu.guild = ch.guild AND gu.server = ch.server AND gu.country = ch.country)
WHERE
gu.id IS NULL