2011-02-04 94 views
0

我有一個大約15列的表。我希望能夠做到的是選擇一系列ID並將所有列數據都呈現給我。SQL查找相同的列數據

在一分鐘,我有它的結構如下所示:

SELECT id, col_a, col_b ... count(id) 
FROM table 
GROUP BY col_a, col_b ... 

,所有的行內返回具有相同的數據組合在一起行 - 這是我想要的一半的,但最好我想能夠獲得單行的值(如果它對於每個行ID都是相同的),或者如果存在單個差異則爲NULL。

我不確定這是否可能,但我寧願看看它是否可以在SQL查詢中編寫一些PHP循環邏輯來檢查每行的相似性。

感謝,

UPDATE:

只是爲了讓這件事到今天爲止,我通過這個問題曾通過寫一個PHP函數,會發現這是重複的,然後顯示差異。不過,現在我已經爲每列創建了一個表格,並將列作爲其他表格的參考。

E.G.在MainTable中,ColA現在引用表ColA

我仍然在解決PHP的問題,主要是因爲我認爲它仍然存在上述問題,但至少現在我沒有存儲重複信息。

+0

我不知道如果你不應該重構你的數據庫架構?擁有關係數據庫的整個想法是防止在不同的地方存儲相同的數據。儘管這樣做可能有一個完全合理的理由。用戶輸入想到...但我會驗證數據,然後將其存儲在數據庫中。 – Peter 2011-02-04 10:57:36

+0

它基於一個圖像庫,每個圖像都有與之相關的數據。一些圖像共享相同的數據,並且在編輯多個圖像的數據時,我所做的這些人需要爲他們顯示「相同」的所有信息。 – Dan 2011-02-04 11:14:40

回答

0

它是一種毛茸茸的事情,但你可以做到這一點類似於大衛·馬藤鬆怎樣的建議,我會寫這樣的,但是:

Select a.id, a.col1, a.col2, a.col3 
FROM myTable a, myTable b 
WHERE a.id != b.id 
and a.col1 = b.col1 
and a.col2 = b.col2 
and a.col3 = b.col3 

這將使你是唯一的ID,但每個結果將具有相同的值第1,2和3列。但是,我同意你的問題的一些評論者,你應該考慮一個替代的數據結構,因爲這樣可以更好地利用RDBMS模型。在這種情況下,你想有2個表:

表名:MyTableIds 字段:ID,attrId

表名:MyTableAttrs 領域:attrId,attR1位,attR2位,attr3,ECT

在一般情況下,如果您有多個記錄要複製的數據,則應將其放入第二個表中並創建一個關係,以便您只需存儲重複數據1次,然後多次引用它。

0

做一個通過加入一個子查詢與組:

SELECT a.id, b.col_a, b.col_b ... b.count) 
FROM table a 
LEFT JOIN (
    SELECT id, col_a, col_b ... count(id) "count" 
    FROM table GROUP BY col_a, col_b ... 
)b on a.id = b.id 

這樣外將選擇所有行。

如果你仍然想組答案,你可以使用UNION代替

SELECT id, col_a ... 
WHERE id NOT IN ("SUBQUERY WITH GROUP BY") 
UNION 
"SUBQUERY WITH GROUP BY" 

不是最好的解決方案,但它應該工作

0

從我如何理解你的問題來看似乎是可行的。

這裏是一個可能的模式:

SELECT 
    /* GROUP BY columns */ 
    col_A, 
    col_B, 
    ... 

    /* aggregated columns */ 
    CASE MIN(col_M) WHEN MAX(col_M) THEN MIN(col_M) ELSE NULL END, 
    CASE MIN(col_N) WHEN MAX(col_N) THEN MIN(col_N) ELSE NULL END, 
    ... 
    COUNT(...), 
    SUM(...), 
    WHATEVER(...), 
    ... 
FROM ... 
GROUP BY col_A, col_B, ...