mysql select/delete 对四个表使用联接

mysql select/delete using join over four tables

我有四个表(在[]中是列):

users [id]

products [id]

productRatings [id,value,user,product]

comments [id,product,user]

我想 select/and 最终删除 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 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) 

您应该可以只在查询中加入字段,然后检查评论是否为空,就像这样...

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 productRatings.id NOT IN (
SELECT productRatings.id FROM `productRatings` JOIN `comments` ON productRatings.user = comments.user AND productRatings.product = comments.product )

我会复制有问题的表,并在将其用于您的生产表之前测试上面是否适用于测试表。

基本上,嵌套的 select 将 return 撰写评级的用户也发表评论的所有 productRatings id。使用 NOT IN,它将删除所有评分的用户没有评论的所有评分。

正如 pala_ 在下面的评论中突出显示的那样,因为此方法使用嵌套 sql,它的性能将比仅在较大表上使用连接的方法更差。

您只需要产品评分和评论table - 以下作品:

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