GROUPing BY 发帖 ID。
聚合函数(如 Count())将适用于每个组,即,对于每个组,将返回一条记录。
您还可以选择组鉴别器(在这种情况下为帖子 ID)。而且 MySQL 在规则上有些松懈,所以你也可以从“posts”表中选择任何字段——但除非你真的必须......不要;-)
sscce:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
//echo 'client version: ', $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), "\n";
//echo 'server version: ', $pdo->getAttribute(PDO::ATTR_SERVER_VERSION), "\n";
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);
$result = $pdo->query('
SELECT
p.id, Count(l.user_id) as lc
FROM
soPosts as p
LEFT JOIN
soLikes as l
ON
l.post_id=p.id
GROUP BY
p.id
', PDO::FETCH_ASSOC);
foreach($result as $row ) {
echo join(', ', $row), "\r\n";
}
function setup($pdo) {
$queries = array(
'
CREATE TEMPORARY TABLE soPosts (
id INT auto_increment,
title varchar(32),
message varchar(32),
primary key(id)
)
',
'
CREATE TEMPORARY TABLE soLikes (
post_id INT,
user_id INT,
primary key(post_id,user_id)
)
',
"INSERT INTO soPosts (title,message) VALUES
('PostA', 'messageA'),('PostB', 'messageB'),('PostC', 'messageC'),('PostD', 'messageD')
",
'INSERT INTO soLikes (post_id,user_id) VALUES
(1, 1),(1, 2),(1, 3),(1, 4),(1, 5),
(2, 4),(2, 5),
(3, 1)
',
);
foreach( $queries as $q ) {
$pdo->exec($q);
}
}
打印
1, 5
2, 2
3, 1
4, 0
(正如预期:每个人都喜欢帖子#1,没有人喜欢#4)