【问题标题】:How I can derive count(*) from another table using LEFT JOIN mysql如何使用 LEFT JOIN mysql 从另一个表中派生 count(*)
【发布时间】:2012-05-05 03:19:51
【问题描述】:

我有如下表定义:

  • 地点
    (ID、名称)
  • 评论
    (id、userid、placeid)
  • 收藏夹
    (id、userid、placeid)
  • 照片
    (id、url、placeid)
    其中placeidPlace 表的id 的外键。

在那张桌子上,我想推导出这样的信息:
- placeid, place name, totalReview, totalFavorite, totalPhoto.

我被卡住了。我目前的进度我可以通过使用这个 mysql 语句从 1 个表中获取信息,就像我可以知道地方的总评论一样: SELECT p.*, count(r.id) as totalReview from Place p left join Review r on p.id = r.placeid group by p.id。 但是,我不知道如何推导出totalFavorite 和totalPhoto。

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您需要单独聚合每个表。这是一种解决方案:

    SELECT p.*, 
           totalreview, 
           totalfavorite, 
           totalphoto 
    FROM   place p 
           LEFT OUTER JOIN (SELECT placeid, 
                                   Count(*) AS totalReview 
                            FROM   review 
                            GROUP  BY placeid) r 
                        ON p.placeid = r.placeid 
           LEFT OUTER JOIN (SELECT placeid, 
                                   Count(*) AS totalFavorite 
                            FROM   favorite 
                            GROUP  BY placeid) f 
                        ON p.placeid = f.placeid 
           LEFT OUTER JOIN (SELECT placeid, 
                                   Count(*) AS totalPhoto 
                            FROM   photo 
                            GROUP  BY placeid) ph 
                        ON p.placeid = ph.placeid 
    

    【讨论】:

    • 使用您的解决方案(LEFT JOIN)与 Ehsan 解决方案 below 的性能如何?不知道这个方案不用LEFT JOIN也能解决。
    • +1 是的,感谢您指出我的回答是错误的。不要忘记外部选择中的totalFavoritetotalPhoto
    • 感谢您的提醒。我编辑了代码以添加两个变量。
    【解决方案2】:

    这是一个简单的方法:

    SELECT
    p.id, p.name,
    (SELECT COUNT(*) FROM Review r WHERE r.placeId=p.id) AS totalReview
    (SELECT COUNT(*) FROM Favorite f WHERE f.placeId=p.id) AS totalFavorite
    (SELECT COUNT(*) FROM Photo ph WHERE ph.placeId=p.id) AS totalPhoto
    FROM Place p
    

    【讨论】:

    • 它可能会返回 OP 想要但您没有使用 LEFT Join 的记录。
    • 哇,我不知道这种问题可以通过使用您的简单解决方案来解决:D,它有效!与上述@Gordon Linoff 解决方案相比,此解决方案是否更有效?
    • 在大多数数据库中,这两种解决方案应该产生相同的查询计划。由于各种原因,我回避相关子查询:对我来说,它们的可读性较差;有时,它们被实现为嵌套循环连接;最后,我喜欢查询引用的所有表都在 from 子句中。
    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 2021-11-06
    • 2021-11-03
    • 2020-05-17
    • 2015-07-14
    • 2012-03-15
    • 2020-11-12
    • 2011-02-06
    相关资源
    最近更新 更多