2012-01-11 113 views
3

我如何使用MySQL来计算一个左连接?如何使用MySQL以COUNT进行LEFT JOIN?

我有两个表,有时评级表中没有相片收视率,所以我认为LEFT JOIN需要的,但我也有一个COUNT声明..

照片

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

(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); 
+0

谢谢大家。以上解决方案 – TheBlackBenzKid 2012-01-11 17:01:00

+0

@TheBlackBenzKid请不要**添加您对问题的回答....要么创建一个新的答案,并在评论中引用它,或者根本不要这样做...... – Neal 2012-01-11 17:03:22

回答

4

的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实例来测试哪个更快,所以测试它们两者。

+0

hehe'+ 1'^_ ^巧妙:-P – Neal 2012-01-11 16:41:31

+0

第二个查询对我来说工作得更快。我在最后一个支架后加了DESC,所以我可以从最高到最低排序。谢谢。唯一的问题是没有转换为PHP – TheBlackBenzKid 2012-01-11 16:50:23

+0

我在上面添加了PHP代码。请你可以告诉我。 – TheBlackBenzKid 2012-01-11 16:56:19

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 
1
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 
+0

我喜欢这个代码和缩进。所以我给了一个加分。易于阅读。 – TheBlackBenzKid 2012-01-11 16:51:18

+0

@TheBlackBenzKid,欣赏它......从这些年来编写SQL的,所以很多有这样的模糊,这使得它很难为以下...的主要“选择,来自哪里,GROUP BY,ORDER BY,具有”在一个层面上保持所有领域和/或标准更容易识别。 – DRapp 2012-01-11 16:53:36

0

我相信,你只需要加入的数据,并在你选择做一个计数(*)。确保你指定了哪个表格你想用于ambigous列。另外,不要忘记在计数(*)时使用按功能分组。以下是我在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 

这个例子的结果是这样的。

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

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