MySQL:如何从一个表中只返回基于不同列不存在的唯一条目?

时间:2014-02-25 13:02:40

标签: php mysql

我正在制作一个非常简单的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中实现这个目标?

2 个答案:

答案 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