Php MySQL:如何从一个不带';不存在基于不同列的另一个?
我正在为一个非常简单的MMORPG开发后端。我使用PHP和MySQL,我有以下表格:Php MySQL:如何从一个不带';不存在基于不同列的另一个?,php,mysql,Php,Mysql,我正在为一个非常简单的MMORPG开发后端。我使用PHP和MySQL,我有以下表格: characters ---------- id,charactername,country,server,guild,xp,level,etc.. guilds ------ id,guildname,country,server 我要寻找的是一种从characters表中收集所有独特的公会的方法,找出哪些公会不在公会表中,并更新公会。棘手的部分似乎是,同一名称的公会可以存在于不同的国家/服务器组合中。以
characters
----------
id,charactername,country,server,guild,xp,level,etc..
guilds
------
id,guildname,country,server
我要寻找的是一种从characters表中收集所有独特的公会的方法,找出哪些公会不在公会表中,并更新公会。棘手的部分似乎是,同一名称的公会可以存在于不同的国家/服务器组合中。以下是一些有效的公会条目示例,以表明它们并不冲突:
21,"Hardworking Ogres","uk","development"
3151,"Hardworking Ogres","us","development"
231,"Hardworking Ogres","us","live"
因此,我有一个关于行会名称、国家和服务器的唯一索引的行会表,它运行良好,因此我不会覆盖条目。我以前一直在将所有的公会/国家/服务器从characters表独立转储到多维数组中。然后从公会表中转储现有公会/国家/服务器的列表。然后,我运行一个类似于array_diff的函数来获取行会表中不存在的唯一行会的列表,并运行一个INSERT查询来更新它
我相信MySQL中有一种更简单的方法可以返回公会表中不存在的公会/国家/服务器组合的唯一列表,然后运行insert节省时间查询2个大规模MySQL请求,然后比较它们。我只是不知道下一步该看哪里,所以我的问题是:在MySQL中有没有实现这一点的方法
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
) ;
在运行查询之前:如果
行会中的索引是(国家、服务器、行会名称)
,请在字符上添加索引(非唯一),列的顺序相同。您可以使用简单的左连接,并检查行会.id
为空的位置:
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
Ypercur的答案可能对我有用,谢谢你的输入。