簡體   English   中英

MySQL:如何根據不同的列只返回一個表中不存在的唯一條目?

[英]MySQL: How do I return only unique entries from one table that don't exist in another based on different columns?

我正在為一個非常簡單的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中實現這一目標?

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上添加索引(不唯一),列的順序相同。

您可以使用簡單的LEFT JOIN並檢查guilds.idNULL

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM