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
我有四个表(在[]中是列):
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