php - 计算与 IN 子句中的所有值匹配的所有行

标签 php mysql

我的值(value)观$topics是 1,2,3 我想做一个类似于 SELECT COUNT(*) FROM subtopics WHERE main_id = 1 AND main_id = 2 and main_id = 3.. 的选择查询

    function countTopics($mid,$forum){
    $topics = implode(', ', array_column($mid, 'main_id'));
    parse_str("id=1");
    $query = "SELECT COUNT(*)
                FROM subtopics
               WHERE main_id   
                  IN ($topics)
                  GROUP BY main_id
                  HAVING COUNT(DISTINCT $topics) = 3";
    $stmt = $forum->prepare($query);
    $stmt->execute(array(
        'mid' => $topics
    ));
    $rows = $stmt->fetchAll();
    $count = implode(', ', array_column($rows, 'COUNT(*)'));
    $_SESSION['topics_count'] = $count;
}

最佳答案

代码存在各种问题,您的 SQL 不需要 HAVING 子句,您尝试绑定(bind)到 SQL 语句中不存在的变量...

function countTopics($mid,$forum){
    $topics = implode(', ', array_column($mid, 'main_id')); 
    $query = "SELECT main_id, COUNT(*) as countID
            FROM subtopics
            WHERE main_id IN ($topics)
            GROUP BY main_id";
    if ( $stmt = $forum->prepare($query) ) {
        if ( $stmt->execute() ) {
            $rows = $stmt->fetchAll();
            $count = implode(', ', array_column($rows, 'countID'));
            $_SESSION['topics_count'] = $count;
        }
     }
}

此外,您还应该检查前一阶段是否有效 - 所以“语句准备是否有效”等。不确定如果其中任何一个失败您会做什么,但这取决于您的应用程序设计。

不确定 $forum 是什么,因为它似乎没有被使用,返回计数值并让调用代码决定如何处理该值会更正常。

你可能想做一些类似的事情......

    $rows = $stmt->fetchAll();
    $_SESSION['topics_count'] = $rows;

然后……

foreach ( $_SESSION['topics_count'] as $topic ) {
   echo $topic['main_id'].'-'.$topic['countID'].PHP_EOL;
}

更新:

function countTopics($mid,$forum){
    $topics = implode(', ', array_column($mid, 'main_id')); 
    $query = "SELECT main_id, subtopic_id, COUNT(*) as countID
            FROM subtopics
            WHERE main_id IN ($topics)
            GROUP BY main_id, subtopic_id";
    if ( $stmt = $forum->prepare($query) ) {
        if ( $stmt->execute() ) {
            $rows = $stmt->fetchAll();
            $_SESSION['topics_count'] = $rows;
        }
     }
}

我添加了一个名为“subtopic_id”的列,这可能需要根据您的数据库列名称进行更改。这将使行类似于...

main_id   subtopic_id countID
1         1            12
1         2            6
1         3            10
2         6            1
2         11           3

这意味着每个 main_id 将有多个行,但它们将有每个子主题和该子主题的计数。如果您想输出数据 - 您将必须使用循环,如上面的 foreach

关于php - 计算与 IN 子句中的所有值匹配的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625813/

相关文章:

mysql - MariaDB 表卡住了

php - 通过 yum 安装 php,包括 mysql 支持

php - 如何在php中将计算列添加到mysql查询结果中?

PHP 这种 key 叫什么?类似于 UUID

php - Bootstrap 3.1.0 不加载脚本?

php - Laravel 和 mySQL 以及关系表

java - 将数据导入 SQLite Android 应用程序数据库

php - 不能调用包裹在闭包中的闭包?

php - 如何使用 Angularjs 操作从 SQL 返回的数据

php - MySQL 或 SQLITE 存储投票者