如何使用MySQL进行左连接计数?

如何使用MySQL进行左连接计数?,mysql,count,Mysql,Count,如何使用MySQL进行左连接计数 我有两个表,有时评级表没有一张照片的评级,所以我认为需要左连接,但我还有一个计数语句 照片 id name src 1 car bmw.jpg 2 bike baracuda.jpg 爱(picid是带有照片id的外键) 在这里,用户只能使用其IP对一个图像进行评级 我想按最高评分的顺序将这两个表组合起来。新桌子 组合 id name src picid 1 car

如何使用MySQL进行左连接计数

我有两个表,有时评级表没有一张照片的评级,所以我认为需要左连接,但我还有一个计数语句

照片

id  name        src
1   car         bmw.jpg
2   bike        baracuda.jpg
(picid是带有照片id的外键)

在这里,用户只能使用其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代码:(更新并添加-工作示例…


您需要使用子查询:

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

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在
groupby
方面非常糟糕,因此您可以尝试将
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实例来测试哪一个更快,所以请同时测试它们。

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

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
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
这个例子的结果是这样的

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

希望有帮助。祝你好运。

第二个查询对我来说运行得更快。我在最后一个括号后添加了DESC,这样我就可以从高到低排序了。谢谢唯一的问题是没有转换为PHPEdited,我修复了它。我喜欢上面的代码和缩进。所以我给了一个加分。“很容易阅读。”布莱克本的孩子,很感激。。。从编写SQL的几年中,很多人都有这样一个模糊的概念,以至于很难遵循。。。主要的“选择、来源、位置、分组依据、订单依据、拥有”处于一个级别,使所有字段和/或条件更易于识别。谢谢大家。上面的解决方案。@TheBlackBenzKid请不要将您的答案添加到问题中。。。。要么创建一个新答案并在评论中引用,要么根本不做。。。
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
77615   SMITH, JANE 1   36
29422   DOE, JOHN   1   648