УДАЛИТЬ ОТ запроса с JOINs не работает? - PullRequest
3 голосов
/ 20 августа 2011

У меня есть следующий запрос MySQL, который я использую с PHP (5.2).

DELETE t1.*, t3.* FROM 
            forum_posts AS t1,
            forum_topics AS t2,
            user_points AS t3
WHERE  t1.topic_id = t2.topic_id
       AND t2.deleted = 1
       AND t1.post_id = t3.id
       AND t3.type = 'post'
       AND t1.post_author = t3.profile_author  

Однако он не работает так, как я собираюсь (ничего не происходит!), Позвольте мне объяснить:

Я собираюсь выполнить запрос, чтобы удалить все строки в таблице forum_posts и / или (я говорю "и / или", потому что это будет зависеть от удаления строк)все строки в user_points table => [если тема, в которой было создано сообщение, была удалена ( для вашей информации, чтобы избежать путаницы, она действительно просто "скрыта" , мы определяем это, проверяя,равно 1)].

Я надеюсь, что структура запроса сама по себе это объясняет, topic_id в основном используется для JOIN таблиц вместе.

Запрос выполняется нормально (даетнет ошибок MySQL или PHP, поэтому я хотел бы предположить, что синтаксис в порядке?), я проверил существующие и удаленные разделы БД (столбец deleted установлен на 1) и их сообщения, которые также существуютдля этих тем (так что это не тот случай, когда нет данных).

Цените все ответы.

1 Ответ

5 голосов
/ 20 августа 2011

У меня есть личное предпочтение всегда указывать соединения в явном виде, а не смешивать все в предложении where. Это также помогает визуализировать, где вам может понадобиться левое соединение.

DELETE forum_posts t1, user_points t3
    FROM forum_posts AS t1
    INNER JOIN forum_topics AS t2 ON t2.topic_id = t1.topic_id
    INNER JOIN user_points AS t3 ON t3.id = t1.post_id
        AND t3.profile_author = t1.post_author
        AND t3.type = 'post'
WHERE t2.deleted = 1

Теперь, основываясь на вашем утверждении, я бы предложил заменить второе ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ:

DELETE forum_posts t1, user_points t3
    FROM forum_posts AS t1
    INNER JOIN forum_topics AS t2 ON t2.topic_id = t1.topic_id
    LEFT JOIN user_points AS t3 ON t3.id = t1.post_id
        AND t3.profile_author = t1.post_author
        AND t3.type = 'post'
WHERE t2.deleted = 1

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...