【问题标题】:how to do a count of results of a mysql query with group_concat and left joins如何使用 group_concat 和左连接计算 mysql 查询的结果
【发布时间】:2021-03-22 16:32:28
【问题描述】:

我正在处理一个带有分页的网页,我现在面临的一个问题是它不适用于我创建的过滤器。

主要分页通过选择具有特定用户 ID 的所有内容来计算我的表格。这在没有过滤器的情况下效果很好,但是使用过滤器我需要更改此查询以添加内部连接和组 concat,因为其他表中的内容被过滤并通过 ID 连接到主表。

我现在有这个过滤器查询:

SELECT DISTINCT games.gameID,games.idUsers,games.gamename,games.comments,games.dateofpurchase,games.lentoutto,games.gameinfo,games.price,games.pictureurl,games.finished,games.rating,games.releasedate, GROUP_CONCAT(DISTINCT labels.labelname ORDER BY labels.labelname) AS labelname, GROUP_CONCAT(DISTINCT category.categoryname ORDER BY category.categoryname) AS categoryname, GROUP_CONCAT(DISTINCT gamemode.gamemode ORDER BY gamemode.gamemode) AS gamemode, GROUP_CONCAT(DISTINCT platform.platform ORDER BY platform.platform) AS platform FROM games LEFT JOIN gamelabels ON gamelabels.gameID=games.gameID LEFT JOIN labels ON labels.labelID=gamelabels.labelID LEFT JOIN categoryconnect ON categoryconnect.gameID=games.gameID LEFT JOIN category ON category.categoryID=categoryconnect.gamescategory LEFT JOIN gamemodesconnect ON gamemodesconnect.gameID=games.gameID LEFT JOIN gamemode ON gamemode.gamemodeID=gamemodesconnect.gamemodeID LEFT JOIN platformconnect ON platformconnect.gameID=games.gameID LEFT JOIN platform ON platform.platformID=platformconnect.platformconnectID WHERE idUsers = '".$userId."' $filter GROUP BY games.gameID ORDER BY gamename

这个过滤器查询就像一个魅力,但你如何计算它返回的数量或行数?

到目前为止,我尝试的所有方法都在选择部分给了我错误。像这样的事情:

SELECT COUNT ( DISTINCT games.gameID,games.idUsers,games.gamename,games.comments,games.dateofpurchase,games.lentoutto,games.gameinfo,games.price,games.pictureurl,games.finished,games.rating,games.releasedate, GROUP_CONCAT(DISTINCT labels.labelname ORDER BY labels.labelname) AS labelname, GROUP_CONCAT(DISTINCT category.categoryname ORDER BY category.categoryname) AS categoryname, GROUP_CONCAT(DISTINCT gamemode.gamemode ORDER BY gamemode.gamemode) AS gamemode, GROUP_CONCAT(DISTINCT platform.platform ORDER BY platform.platform) AS platform) FROM games LEFT JOIN gamelabels ON gamelabels.gameID=games.gameID LEFT JOIN labels ON labels.labelID=gamelabels.labelID LEFT JOIN categoryconnect ON categoryconnect.gameID=games.gameID LEFT JOIN category ON category.categoryID=categoryconnect.gamescategory LEFT JOIN gamemodesconnect ON gamemodesconnect.gameID=games.gameID LEFT JOIN gamemode ON gamemode.gamemodeID=gamemodesconnect.gamemodeID LEFT JOIN platformconnect ON platformconnect.gameID=games.gameID LEFT JOIN platform ON platform.platformID=platformconnect.platformconnectID WHERE idUsers = '".$userId."' $filter GROUP BY games.gameID ORDER BY gamename

【问题讨论】:

    标签: mysql count inner-join group-concat


    【解决方案1】:

    我认为您尝试做的是正确的方法,使用子查询。在 MySQL 中,每个子查询表都需要一个标识符,该标识符在包装查询的右括号之后传递,如下所示:

    SELECT COUNT(*) FROM (
        SELECT DISTINCT games.gameID,games.idUsers,games.gamename,games.comments,games.dateofpurchase,games.lentoutto,games.gameinfo,games.price,games.pictureurl,games.finished,games.rating,games.releasedate, GROUP_CONCAT(DISTINCT labels.labelname ORDER BY labels.labelname) AS labelname, GROUP_CONCAT(DISTINCT category.categoryname ORDER BY category.categoryname) AS categoryname, GROUP_CONCAT(DISTINCT gamemode.gamemode ORDER BY gamemode.gamemode) AS gamemode, GROUP_CONCAT(DISTINCT platform.platform ORDER BY platform.platform) AS platform FROM games LEFT JOIN gamelabels ON gamelabels.gameID=games.gameID LEFT JOIN labels ON labels.labelID=gamelabels.labelID LEFT JOIN categoryconnect ON categoryconnect.gameID=games.gameID LEFT JOIN category ON category.categoryID=categoryconnect.gamescategory LEFT JOIN gamemodesconnect ON gamemodesconnect.gameID=games.gameID LEFT JOIN gamemode ON gamemode.gamemodeID=gamemodesconnect.gamemodeID LEFT JOIN platformconnect ON platformconnect.gameID=games.gameID LEFT JOIN platform ON platform.platformID=platformconnect.platformconnectID WHERE idUsers = '".$userId."' $filter GROUP BY games.gameID ORDER BY gamename
    ) count_test;
    

    【讨论】:

    • 感谢泰瑞尔!这似乎确实有效!但是根据我的理解(这整个项目对我来说是一个很大的 php 和 mysql 学习曲线),你所做的是为计数(count_test)创建一个临时列,并将整个原始查询作为你通常会放置的位置您选择的列?
    • 欢迎。我们所做的是创建一个只有一列的临时表(count(*))。我们创建临时表的方式称为子查询。我们也可以向子查询添加更多列,它的行为非常类似于常规表。我可以推荐的是使用 MySQL 的EXPLAIN 函数。对于每个 SELECT 查询,您可以预先添加 EXPLAIN,MySQL 的分析器将返回有关它如何处理查询及其结构的有用信息。如果有子查询,它也会报告子查询。
    • 感谢您的解释?
    猜你喜欢
    • 2016-07-03
    • 2020-07-29
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 2013-08-25
    • 2012-08-08
    相关资源
    最近更新 更多