2010-06-17 46 views
0

我想弄清楚在表中對一組記錄做一些相對簡單的操作的SQL,但我被卡住了。考慮一個每個項目有多行的表格,這些表格都由一個公共密鑰標識。使用(My)SQL中的行集合並比較值

例如:

serial model color 
XX1 A  blue 
XX2 A  blue 
XX3 A  green 
XX5 B  red 
XX6 B  blue 
XX1 B  blue 

我將例如想要做的是:

  1. 假設所有模型中的行必須具有相同的顏色,發現其不行。 (例如,XX3是綠色的)。

  2. 假定一個給定的序列號可以只指向單一類型的模型,找出其不發生的行(例如XX1點既A和B)

這些是所有簡單的邏輯事情都要做。爲了抽象它,我想知道如何使用單個鍵(或鍵的組合)對事物進行分組,然後比較這些記錄的值。

我應該在同一張桌子上使用連接嗎?我應該使用某種數組還是類似的?

感謝您的幫助

回答

0

爲了解決#1,我會用一個自連接(在同一表的連接,因爲你把它)。

例如,

select * 
from mytable 
where serial in (select serial 
       from mytable 
       group by model, color 
       having count(*) = 1) 

會發現所有的序列號,只有在一個存在色差。我沒有測試這個,但我希望你看到它的作用。內部選擇查找所有僅出現一次的記錄,然後外部選擇顯示這些連續出版物的所有詳細信息。

當然,話說回來,這是一個貧窮的表設計。但我不認爲這是你的問題。我希望這是一個真實情況的例子。我擔心的是,沒有理由認爲單一事件實際上是不好的 - 可能有10條記錄,所有這些記錄都有不同的顏色。這種方法會告訴你,他們都是錯的,你不能決定哪個是正確的。

3

爲1:

SELECT model, color, COUNT(*) AS num FROM yourTable GROUP BY model, color; 

這會給你每個模型的列表,每個顏色與統計沿着模型。因此,從數據集的輸出將是:

model color num 
A  blue 2 
A  green 1 
B  red 1 
B  blue 2 

從這個輸出,你可以很容易地看到什麼是不正確的,使用UPDATE語句修復它還是在那裏你分配最流行的顏色,每個模型毯子操作。

對於2:

SELECT serial, COUNT(*) AS num FROM yourTable GROUP BY serial HAVING num > 1 

這種情況的輸出將是:

serial num 
XX1 2