【问题标题】:sql join a single entry with the sum of multiple entry tablesql将单个条目与多个条目表的总和连接起来
【发布时间】:2015-04-16 23:11:35
【问题描述】:

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

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

SQL 和 laravel 等价物的首选答案。任何人都会这样做。谢谢

【问题讨论】:

  • 你能为你的表提供一个定义吗?没有这些答案只能给你最一般的实现。另外,你的 laravel 模型是什么样的,到目前为止你尝试了什么,你遇到了什么问题?

标签: php mysql sql laravel


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    使用:

    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
    

    【讨论】:

      【解决方案3】:

      试试这个

      $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";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多