2014-02-25 63 views
0

我在一個非常簡單的MMORPG的後端工作。我在PHP和MySQL我有以下表工作: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" 

所以我有公會表上guildname,國家和服務器的唯一指標 - 所以,我不是效果很好覆蓋條目。我以前一直在從字符表中將所有公會/國家/服務器的DISTINCT轉儲爲多維數組。然後從公會表中刪除現有的公會/國家/服務器列表。然後,我運行一個類似於array_diff的函數來獲取guilds表中不存在的唯一列表,並運行INSERT查詢來更新它。

我相信在MySQL中有一種更簡單的方法可以返回公會表中不存在的任何公會/國家/服務器組合的唯一列表,然後運行插入保存時間查詢2個大量MySQL請求,然後比較它們。我只是不知道下一步要看什麼,所以我的問題是:有沒有辦法在MySQL中實現這一點?

回答

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

您可以使用一個簡單的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 
+0

從ypercube答案爲我工作,謝謝您的輸入,以及。 – SystemX17

相關問題