2014-01-23 40 views
0

更新如下!更新基於group_concat的mysql表

誰能幫我出

我有一個表:

CREATE TABLE `group_c` (
`parent_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`child_id` int(11) DEFAULT NULL, 
`number` int(11) DEFAULT NULL, 
    PRIMARY KEY (`parent_id`) 
) ENGINE=InnoDB; 


INSERT INTO group_c(parent_id,child_id) 
VALUES (1,1),(2,2),(3,3),(4,1),(5,4),(6,4),(7,6),(8,1),(9,2),(10,1),(11,1),(12,1),(13,0); 

我想更新數場1具有多個家長每個孩子

SELECT group_concat(parent_id), count(*) as c FROM group_c group by child_id having c>1 

結果:

GROUP_CONCAT(PARENT_ID)  C 
12,11,10,8,1,4   6 
9,2      2 
6,5      2 

個因此,與PARENT_ID 12,11,10,8,1,4,9,2,6,5所有行應更新數= 1

我已經試過類似:

UPDATE group_c SET number=1 WHERE FIND_IN_SET(parent_id, SELECT pid FROM (select group_concat(parent_id), count(*) as c FROM group_c group by child_id having c>1)); 

但那是行不通的。

我該怎麼做?

SQLFIDDLE:http://sqlfiddle.com/#!2/acb75/5

[編輯]

我試圖讓這個例子簡單,但真實的東西是一個比較複雜一點,因爲我被多個字段分組。這裏是一個新的小提琴:http://sqlfiddle.com/#!2/7aed0/11

回答

0

對於任何有興趣的人。這是我解決它的方式。這是在兩個查詢,但在我的情況下,這不是一個真正的問題。

UPDATE group_c INNER JOIN (
SELECT parent_id, count(*) AS c 
FROM `group_c` 
GROUP BY child1,child2 
HAVING c >1 
) AS cc ON cc.parent_id = group_c.parent_id 
SET group_c.number =1 WHERE number =0; 


UPDATE group_c INNER JOIN group_c as gc ON 
(gc.child1=group_c.child1 AND gc.child2=group_c.child2 AND gc.number=1) 
SET group_c.number=1; 

小提琴:http://sqlfiddle.com/#!2/46d0b4/1/0

1

爲什麼要用GROUP_CONCAT(),然後嘗試通過FIND_IN_SET()做結果?這不是SQL如何工作的。您可以使用簡單JOIN檢索您的記錄:

SELECT 
    parent_id 
FROM 
    group_c 
    INNER JOIN 
    (SELECT 
    child_id, 
    count(*) as c 
    FROM 
    group_c 
    group by 
    child_id 
    having c>1) AS childs 
    ON childs.child_id=group_c.child_id 

- 檢查你的modified demo。如果你想UPDATE,那麼只需使用:

UPDATE 
    group_c 
    INNER JOIN 
    (SELECT 
    child_id, 
    count(*) as c 
    FROM 
    group_c 
    group by 
    child_id 
    having c>1) AS childs 
    ON childs.child_id=group_c.child_id 
SET 
    group_c.number=1 
+0

看來OP希望使用該'select'的'update'解決方案。 –

+0

是的,但他質疑正確的選擇。無論如何,我已更新 –

+0

我想使用group_concat的原因是因爲實際表比我的示例稍微複雜一些。而不是一個child_id我分組多個字段(如GROUP BY child_id1,child_id2,child_id3)。但我會檢查是否可以用連接重寫它。 – Nin

0

這裏有一個類似的解決方案......

UPDATE group_c a 
    JOIN 
    (SELECT DISTINCT x.child_id candidate 
        FROM group_c x 
        JOIN group_c y 
        ON y.child_id = x.child_id 
        AND y.parent_id < x.parent_id 
    ) b 
    ON b.candidate = a.child_id 
    SET number = 1; 

http://sqlfiddle.com/#!2/bc532/1