У меня есть четыре таблицы (в [] столбцы):
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.
Вам нужна только таблица с описаниями продуктов и комментариями — следующие работы:
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
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, он будет работать хуже, чем метод, который использует соединения только в больших таблицах.
Вы должны иметь возможность просто соединить поля в запросе, а затем проверить, является ли комментарий пустым, например, так …
DELETE FROM `productRatings`
JOIN `comments` ON (`productRatings`.`product` = `comments`.`product`)
WHERE `comments`.`comment_field` IS NULL
AND `productRatings`.`user_id` = ?;
IS NULL может потребоваться заменить на = » в зависимости от используемого вами механизма базы данных.
Не забудьте сначала протестировать тестовый экземпляр БД!
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)