如何使用 MySQL 通过 LEFT JOIN 进行计数?

The*_*Kid 3 mysql count

如何使用 MySQL 进行 LEFT JOIN 计数?

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

相片

id  name        src
1   car         bmw.jpg
2   bike        baracuda.jpg
Run Code Online (Sandbox Code Playgroud)

喜欢(picid 是带有照片 ID 的外键)

id  picid   ratersip
4   1       81.0.0.0
6   1       84.0.0.0
7   2       81.0.0.0
Run Code Online (Sandbox Code Playgroud)

在这里,用户只能使用其 IP 对一张图像进行评分。

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

组合

id  name    src            picid
1   car     bmw.jpg        1
2   bike    baracuda.jpg   2
Run Code Online (Sandbox Code Playgroud)

(宝马是最高评价)

我的 MySQL 代码:

SELECT * FROM photos 
LEFT JOIN ON photos.id=loves.picid 
ORDER BY COUNT (picid);
Run Code Online (Sandbox Code Playgroud)

我的 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);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 5

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)
Run Code Online (Sandbox Code Playgroud)

话虽如此,我知道 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)
Run Code Online (Sandbox Code Playgroud)

我没有 MySQL 实例来测试哪个更快,所以对它们都进行测试。