2010-06-07 2 views
7

Привет У меня есть таблицы, как это:MYSQL UPDATE с IN и подзапрос

запись таблицы:

ид | total_comments
_____________________
1 | 0
2 | 0
3 | 0
4 | 0

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

идентификатор | eid | комментарий
_____________________
1 | 1 | комментарий sdfd
2 | 1 | испытательные испытания
3 | 1 | текст комментария
4 | 2 | фиктивный комментарий
5 | 2 | образец комментария
6 | 1 | фг FGH DFH

запросы я пишу:

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

результатов я получаю: запись

стола:

идентификатора | total_comments
_____________________
1 | 1
2 | 1
3 | 0
4 | 0

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

запись таблицы:

идентификатор | total_comments
_____________________
1 | 4
2 | 2
3 | 0
4 | 0

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

ответ

14

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

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)) 
+0

да, я ищу что-то подобное ... Моим мотивом является запуск запроса на обновление на основе подзапроса .... его обновление «total_comments» в таблице «ввода» с acutal количество комментариев, для удостоверения личности в «записи» если я запустить запрос, который я указал, что только добавляет 1 для всех количества комментариев, найденного в subqery Вот, что SQL-запрос превращается после прогонов подзапросов:. UPDATE записи SET total_comments = total_comments + 1 WHERE id IN (1,1,1,2,2,1) , поэтому обновление выполняется только один раз для 1 и 2 идентификаторов в таблице входа. Coz его как работает IN. Но я хочу, чтобы некоторые из них запускали его 4 раза в течение 1 и 2 раз для 2. – Johal

+0

Единственный способ, которым я думаю, - запустить подзапрос, что-то вроде этого, что я не знаю, как это сделать: UPDATE entry SET total_comments = total_comments + @count WHERE id IN (SELECT eid, count (*) as @count FROM comments WHERE id IN (1,2,3,4,5,6)) , но тогда In не работает coz из нескольких строк и также я не знаю, как ссылаться @count в установленном состоянии :( – Johal

1

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

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

+0

я знаю ... но я хочу какой-то метод, так что я могу рассчитывать количество entry.id в subqery. Я могу сделать это, выполнив команду subquery sperate, а затем выполнив запрос на обновление, используя для цикла для всех этих. Но я хочу сделать это в одном запросе, это моя проблема :( – Johal

1

Try:

UPDATE entry 
    SET total_comments = (SELECT COUNT(*) 
         FROM comments 
         WHERE entry.id = comments.eid 
         GROUP BY id) 
+0

это будет работать для всех записей в таблице ввода, но я хочу запустить только для определенных записей, поэтому я использовал предложение IN ... – Johal

3

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

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

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

+0

+1: Я полностью согласен, это это лучший выбор дизайна, чем текущая структура таблицы. –

0
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)) 
Смежные вопросы