【问题标题】:mysql select/delete using join over four tablesmysql 选择/删除使用连接四个表
【发布时间】:2015-06-30 05:40:37
【问题描述】:

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

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 教程进行挖掘。

【问题讨论】:

    标签: php mysql join multiple-tables


    【解决方案1】:

    您只需要 productratings 和 cmets 表 - 以下工作:

    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

    【讨论】:

    • 这个搞定了,谢谢,这个加入的事情当你知道你在做什么的时候真的很简单
    【解决方案2】:
    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 id。使用NOT IN,它将删除所有评分用户没有评论的评分。

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

    【讨论】:

    • 对于大型表,这将比仅使用连接的版本更差。
    • @pala_ 是的,我会将其添加到我的答案中。您的答案似乎更好,因为它不使用嵌套 sql。
    【解决方案3】:

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

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

    根据您使用的数据库引擎,可能需要将 IS NULL 替换为 = ''。

    记得先在数据库的测试实例上进行测试!

    【讨论】:

    • 我不确定您是否需要加入用户表,因为 cmets 和评级表都有用户 ID。
    • 我认为这会失败,因为它是一个联接,而您尚未指定要从哪个表中删除。
    • 它会失败的原因不止于此。 join 执行inner join,这意味着它只会返回匹配的行,因此where 子句的is null 部分始终为假,因此即使语法正确,它也不会删除任何内容。
    【解决方案4】:
      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) 
    

    【讨论】:

    • 这并没有完成 OP 的要求。它想删除创建产品评级的用户没有评论的产品评级。如果存在任何评论,请不要保留它
    • @pala_ 谢谢!我要禁食。
    • 这可能会失败,因为 WHERE id = 的嵌套选择将提供多个结果。您使用IS NULL 应该是IN 而不是=
    • @BobNocraz 谢谢!我改变了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多