我有一个存储单个条目帖子(POSTS)的表格和另一个存储多个喜欢帖子的用户条目的表格。 user_id和帖子被喜欢的日期。 (POSTLIKES)
我如何编写一个单独的查询来从帖子表中选择每个帖子,并在postlikes表中将条目数计为总和,其中posts.id = postlikes.post_id。
SQL中的优选答案和laravel等价物。任何事都可以。感谢
答案 0 :(得分:1)
使用:
Select COUNT(postlikes.id), postlikes.post_id, posts.name as post_name from postlikes inner join postlikes on posts.id = postlikes.post_id group by postlikes.post_id
答案 1 :(得分:1)
通过GROUPing BY帖子ID 聚合函数(如Count())将对每个组起作用,即对于每个组,将返回一个记录 您还可以SEELCT小组鉴别器(在这种情况下为post id)。 MySQL在规则上有些松懈,所以你也可以从“posts”表中选择任何字段 - 但除非你真的必须......不要; - )
<?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)
答案 2 :(得分:0)
试试这个
$query="SELECT tbl1.col1, tbl1.col2, tbl2.col1, tbl2.col2 from POSTS as tbl1 inner join POSTLIKES as tbl2 on tbl1.post_id=tbl2.post_id";