ОБНОВЛЕНИЕ MYSQL с IN и подзапросом - PullRequest
9 голосов
/ 08 июня 2010

Привет, у меня есть такие таблицы:

запись в таблице:

id | total_comments
_____________________
1 | 0
2 | 0
3 | 0
4 | 0

комментарии к таблице:

id | Ид | комментарий
_____________________
1 | 1 | комментарий sdfd
2 | 1 | тестирование тестирование
3 | 1 | текст комментария
4 | 2 | фиктивный комментарий
5 | 2 | пример комментария
6 | 1 | фг фгх дфх

Запрос я пишу:

UPDATE entry 
   SET total_comments = total_comments + 1 
 WHERE id IN ( SELECT eid 
                 FROM comments 
                WHERE id IN (1,2,3,4,5,6))

Результаты, которые я получаю:

запись в таблице:

id | total_comments
_____________________
1 | 1
2 | 1
3 | 0
4 | 0

Ожидаемые результаты:

запись в таблице:

id | total_comments
_____________________
1 | 4
2 | 2
3 | 0
4 | 0

Любая помощь будет оценена.

Ответы [ 5 ]

17 голосов
/ 08 июня 2010

Использование:

UPDATE entry 
   SET total_comments = (SELECT COUNT(*)
                           FROM COMMENTS c
                          WHERE c.eid = id
                       GROUP BY c.eid)
 WHERE id IN ( SELECT eid 
                 FROM comments 
                WHERE id IN (1,2,3,4,5,6))
3 голосов
/ 08 июня 2010

Если вам действительно нужно total_comments в отдельной таблице, я бы сделал это VIEW.

CREATE VIEW entry AS 
  SELECT id, COUNT(comments) AS total_comment 
  FROM comments 
  GROUP BY id

Таким образом, вы избегаете задачи обслуживания по полному обновлению таблицы total_comments.

1 голос
/ 08 июня 2010

Попробуйте:

UPDATE entry
  SET total_comments = (SELECT COUNT(*) 
                        FROM comments
                        WHERE entry.id = comments.eid
                        GROUP BY id)
1 голос
/ 08 июня 2010

Это именно то, что я ожидал. Идентификатор находится в наборе, который вы ему даете, поэтому total_comments = total_comments + 1.

Он не будет добавлять по одному для каждого экземпляра одного и того же значения: это не то, как работает IN. IN вернет простое логическое значение да / нет.

0 голосов
/ 08 июня 2010
UPDATE entry e 
    SET total_comments = ( SELECT COUNT(*) FROM comments WHERE eid = e.id)  
    WHERE 
    e.id in (SELECT eid FROM comments WHERE id IN (1,2,3,4,5,6))
...