2013-10-20 89 views
1

在一個MySQL表進行檢查有以下欄目:MySQL在唯一的列組合

id, spn(PK), cat1, cat2, cat3, act1, act2, act3 

(貓字段是VARCHAR類型,行爲領域是INT),我需要進行檢查,看是否所有catXX字段的唯一組合的總和等於所有actXX字段的唯一組合,如果不是,則返回發現的不匹配的spn值的列表。

我最初的想法是要進行選擇的concat(cat1,cat2,cat3) as A還有concat(act1,act2,act3) as B並加以比較,但我不太清楚如何進行比較,並返回找到SPN的名單,其中A <> B。任何想法都歡迎。

我的應用程序是在PHP中,所以如果你可以建議使用PHP的解決方案,那很好。

NOTE:基於前2個答案,我想澄清一下,我試圖檢查所有貓字段的唯一組合的數目是否等於動作字段組合的數量。

Sample data

回答

0

我不知道列的類型,所以我會用最標準的解決方案去:

SELECT spn 
FROM table 
WHERE cat1 != act1 || cat2 != act2 || cat3 != act3 

也許你的數據庫設計可以改善。在列名中引入數字通常是壞設計的同義詞。

編輯:假設順序是不是在你的置換重要:

SELECT id 
FROM files_imported 
WHERE ((cat1 != cat2) + (cat1 != cat3) + (cat2 != cat3)) != ((act1 != act2) + (act1 != act3) + (act2 != act3)) 
+1

我不是每場CATX比較等效ACTX後場,但檢查貓場組合的數目是等於動作字段組合的數量。就結構而言,我沒有設計數據庫,我只是在執行一些數據檢查。 – bikey77

+0

然後,我不確定要理解您要執行的檢查。儘管如此,我認爲在你的問題中描述的'CONCAT'解決方案在*比較組合數量方面不會更好。 –

+0

通過連接字段和按連接值分組,您可以獲得唯一組合的數量。這是我之後那些組合的比較。 – bikey77