sql使用多个条目表的总和加入单个条目

时间:2015-02-16 12:28:11

标签: php mysql sql laravel

我有一个存储单个条目帖子(POSTS)的表格和另一个存储多个喜欢帖子的用户条目的表格。 user_id和帖子被喜欢的日期。 (POSTLIKES)

我如何编写一个单独的查询来从帖子表中选择每个帖子,并在postlikes表中将条目数计为总和,其中posts.id = postlikes.post_id。

SQL中的优选答案和laravel等价物。任何事都可以。感谢

3 个答案:

答案 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”表中选择任何字段 - 但除非你真的必须......不要; - )

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)

答案 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";