【问题标题】:How can I use MySQL to COUNT with a LEFT JOIN?如何使用 MySQL 通过 LEFT JOIN 进行计数?
【发布时间】:2012-01-11 16:34:44
【问题描述】:

如何使用 MySQL 来计算 LEFT JOIN?

我有两个表,有时 Ratings 表没有照片的评分,所以我认为需要 LEFT JOIN 但我也有一个 COUNT 语句..

照片

id  name        src
1   car         bmw.jpg
2   bike        baracuda.jpg

Loves(picid 是带有照片 id 的外键)

id  picid   ratersip
4   1       81.0.0.0
6   1       84.0.0.0
7   2       81.0.0.0

在这里,用户只能使用他们的 IP 对一张图片进行评分。

我想按评分最高的顺序组合这两个表。新表

合并

id  name    src            picid
1   car     bmw.jpg        1
2   bike    baracuda.jpg   2

(宝马评分最高)

我的 MySQL 代码:

SELECT * FROM photos 
LEFT JOIN ON photos.id=loves.picid 
ORDER BY COUNT (picid);

我的 PHP 代码:(已更新和添加 - 工作示例...)

$sqlcount = "SELECT p . *
FROM `pics` p
LEFT JOIN (

SELECT `loves`.`picid`, count( 1 ) AS piccount
FROM `loves`
GROUP BY `loves`.`picid`
)l ON p.`id` = l.`picid`
ORDER BY coalesce( l.piccount, 0 ) DESC";

$pics = mysql_query($sqlcount);

【问题讨论】:

  • 谢谢大家。上面的解决方案。
  • @TheBlackBenzKid 请将您的答案添加到问题中......要么创建一个新答案并在评论中引用它,要么不要这样做所有...

标签: mysql count


【解决方案1】:

MySQL 允许您仅按 id 列进行分组:

select
    p.*
from
    photos p 
    left join loves l on
        p.id = l.picid
group by
    p.id
order by
    count(l.picid)

话虽如此,我知道 MySQL 在 group by 方面确实很差,所以您可以尝试将 loves 计数放在联接的子查询中以优化它:

select
    p.*
from
    photos p
    left join (select picid, count(1) as piccount from loves group by picid) l on
        p.id = l.picid
order by
    coalesce(l.piccount, 0)

我没有要测试哪个更快的 MySQL 实例,因此请同时测试它们。

【讨论】:

  • 第二个查询对我来说工作得更快。我在最后一个括号之后添加了 DESC,这样我就可以按从高到低对它们进行排序。谢谢。唯一的问题是 PHP 没有转换
  • 已编辑,我已修复。上面回答。
【解决方案2】:

你需要使用子查询:

SELECT id, name, src FROM (
  SELECT photos.id, photos.name, photos.src, count(*) as the_count 
  FROM photos 
  LEFT JOIN ON photos.id=loves.picid 
  GROUP BY photos.id
) t 
ORDER BY the_count

【讨论】:

    【解决方案3】:
    select
          p.ID,
          p.name,
          p.src,
          PreSum.LoveCount
       from
          Photos p
             left join ( select L.picid,
                                count(*) as LoveCount
                            from
                               Loves L
                            group by
                               L.PicID ) PreSum
               on p.id = PreSum.PicID
       order by
          PreSum.LoveCount DESC
    

    【讨论】:

    • 我喜欢这里的代码和缩进。所以我给了一个加分。易于阅读。
    • @TheBlackBenzKid,欣赏它...从编写 SQL 的这些年来看,很多人都有这样的模糊性,以至于很难遵循...主要的“选择,来自,哪里,组by, order by, having”在一个层次上使所有字段和/或标准更容易识别。
    【解决方案4】:

    我相信您只需要加入数据并在您的选择中进行计数(*)。确保指定要用于不明确的列的表。另外,不要忘记在执行 count(*) 时使用 group by 函数。这是我在 MS SQL 上运行的示例查询。

    Select CmsAgentInfo.LOGID, LOGNAME, hCmsAgent.SOURCEID, count(*) as COUNT from hCmsAgent
    LEFT JOIN CmsAgentInfo on hCmsAgent.logid=CmsAgentInfo.logid
    where SPLIT = '990'
    GROUP BY CmsAgentInfo.LOGID, LOGNAME, hCmsAgent.SOURCEID
    

    this 的示例结果将是这样的。

    77615   SMITH, JANE 1   36
    29422   DOE, JOHN   1   648
    

    希望对您有所帮助。祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多