MySQL выбрать / удалить, используя объединение четырех таблиц

У меня есть четыре таблицы (в [] столбцы):

users [id]

products [id]

productRatings [id,value,user,product]

comments [id,product,user]

Я хотел бы выбрать / и в конечном итоге удалить productRatings, если один и тот же пользователь не связал комментарий с этим продуктом. То есть, если пользователь оценил продукт, но не прокомментировал, этот рейтинг следует удалить.

Я считаю, что я мог бы достичь этого, используя два запроса, во-первых:

SELECT user, product FROM productRatings

а затем для каждого ряда:

    SELECT COUNT(*) FROM comments WHERE product=productRatings.product AND user=productRatings.user

а потом что-то вроде

    if $queryAbove==0 : DELETE FROM productRatings WHERE id=productRatings.id

Я хотел бы решить эту проблему с помощью JOIN и узнать больше на примере, а не копаться в руководствах по JOIN.

7

Решение

Вам нужна только таблица с описаниями продуктов и комментариями — следующие работы:

delete pr
from productratings pr
left join comments c
on pr.userid = c.userid
and pr.productid = c.productid
where c.productid is null

И здесь есть демо: http://sqlfiddle.com/#!9/89575/1

4

Другие решения

DELETE FROM `productRatings` WHERE productRatings.id NOT IN (
SELECT productRatings.id FROM `productRatings` JOIN `comments` ON productRatings.user = comments.user AND productRatings.product = comments.product )

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

По сути, вложенный выбор вернет все идентификаторы productRatings, к которым пользователь, который написал оценку, также оставил комментарий. С помощью NOT IN, он удалит все оценки, которые пользователь, который сделал оценку, также не комментировал.

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

2

Вы должны иметь возможность просто соединить поля в запросе, а затем проверить, является ли комментарий пустым, например, так …

DELETE FROM `productRatings`
JOIN `comments` ON (`productRatings`.`product` = `comments`.`product`)
WHERE `comments`.`comment_field` IS NULL
AND `productRatings`.`user_id` = ?;

IS NULL может потребоваться заменить на = » в зависимости от используемого вами механизма базы данных.

Не забудьте сначала протестировать тестовый экземпляр БД!

1

  DELETE FROM productRatings WHERE id IN (SELECT pr.id FROM productRatings pr
LEFT JOIN comments c on c.product = pr.product
WHERE c.user = pr.user
AND pr.comment IS NULL)
0
По вопросам рекламы [email protected]