计算每一行的注释Union和Left Join

时间:2018-10-18 02:44:23

标签: php mysql sql mysqli

请参阅下面的示例数据。

这是我到目前为止所拥有的。

SELECT 
    table1.stuff, 
    COUNT(table1.id) AS row_count, 
    COUNT(comment_table.id) AS comment_count 

FROM table1 
    LEFT JOIN comment_table 
        ON table1.id = comment_table.page_id 
            AND comment_table.page_type = 'nofun'

UNION 

SELECT 
    table2.stuff, 
    COUNT(table2.id) AS row_count, 
    COUNT(comment_table.id) AS comment_count 

FROM table2 
    LEFT JOIN comment_table 
        ON table2.id = comment_table.page_id 
            AND comment_table.page_type = 'fun' 

样本数据表1:

id     stuff
1      the stuff
2      other stuff

样本数据表2:

id     stuff
1      the stuff still
2      other stuff still

样本数据注释表:

id     page_id     page_type     comment 
5      1           fun           Ello
6      2           nofun         hey janis

所需结果:

stuff              comment_count    row_count
the stuff still    1                2
other stuff        1                0 
样本数据的逻辑: 我想返回table1和table2的所有行。我还想从与表1和表2中的每一行关联的comment_table中获取注释的总数,最后,计算从表1和表2返回的行总数。

table1和table2具有“ page_type”,在这种情况下,table1是“ nofun”,而table2是“ fun”。每个注释表行都通过它的“ page_type”和“ page_id”(table1或table2的行ID)与table1或table2相关。

table1 id:2有一个注释(comment_table id:6),而table2 id:1有一个注释(comment_table id:5)。

期望的结果表显示了两个样本行,其中有来自table1和table2的'stuff',以及每一行的注释计数以及总行数。

我不认为我完全理解左派。我该如何实现自己的目标?

1 个答案:

答案 0 :(得分:0)

感谢@Solarflare指出缺少GROUP BY。

这是我需要的:

UserControl

数据结果:

SELECT 
    `table1`.`stuff`, 
    COUNT(`comment_table`.`id`) AS comment_count 

FROM `table1` 
    LEFT JOIN `comment_table` 
        ON `table1.id` = `comment_table`.`page_id` 
            AND `comment_table`.`page_type` = 'nofun' 
GROUP BY `table1`.`id`

UNION 

SELECT 
    `table2`.`stuff`, 
    COUNT(`comment_table`.`id`) AS comment_count 
FROM `table2` 
    LEFT JOIN `comment_table` 
        ON `table2`.`id` = `comment_table`.`page_id` 
            AND `comment_table`.`page_type` = 'fun'
GROUP BY `table2`.`id`

我删除了“ row_count”,因为数据已正确分组,因此我可以从$ page-> num_rows获得总行数。

谢谢所有花时间查看我的问题的人,当然还有那些花时间发表评论的人。