【问题标题】:count rows in table with many different parameters使用许多不同的参数计算表中的行数
【发布时间】:2014-02-10 22:56:23
【问题描述】:

我知道我可以像这样计算表的列中有多少行有某个字符串...

  $timeOfClass="W-7PM-A";
  $inclass101 = $db->prepare("SELECT count(*) FROM students WHERE timeOfClass =?");
  $inclass101->execute(array($timeOfClass));
  $inclass101rows = $inclass101->fetchColumn(0);

$inClass101rows 反映了我的数据库中$timeOfClassW-7PM-A 的行数。

但是如何在不编写多个 SQL 语句的情况下对 $timeOfClass 字符串的多个变量执行此操作?我有很多。这是否类似于创建一个 SQL 语句数组,然后通过 fetchColumn(0) 的 while 循环运行它们?

【问题讨论】:

  • 示例:WHERE timeOfClass IN ('W-7PM-A', 'W-7PM-B', 'W-7PM-C');(使用IN)然后是数组。
  • 如果您要问的是“我怎样才能拥有一个可变长度数组并将其传递到准备好的语句中”,答案是您必须跳过一些障碍。但是环顾四周寻找“数组”和“准备好的语句”和 pdo,你应该会看到一些方法

标签: php mysql sql pdo


【解决方案1】:
<?php

// $timesOfClasses is an array in the form:
$timesOfClass = array(
    "W-7PM-A",
    "X-8AM-Y",
    "...",
);


// Generate the IN clause safely for usage with prepared statements
$params = substr(str_repeat("?,", count($timesOfClass)), 0, -1);

$inclass101 = $db->prepare("SELECT COUNT(*) FROM `students` WHERE `timeOfClass` IN({$params})");
$inclass101->execute($timesOfClass);
$inclass101rows = $inclass101->fetchColumn(0);

使用 SQL 更改结果,例如:添加一个GROUP BY 子句以获取多个循环计数。

【讨论】:

  • 看起来很棒!我如何分隔结果以查找表中每个字符串的实例数?
  • 我不知道您的数据库抽象是如何工作的,但是您可以将GROUP BY timeOfClass 添加到您的 SQL 查询中并使用循环遍历结果,它会给您每次上课的次数.
【解决方案2】:

您是否尝试对 $timeOfClass 的多个值执行此操作?

您可以将所有 $timeOfClass 变量放在一个数组中(W-7PM-A、W-8PM-A 等),然后使用这样的 sql:

选择计数(*) 来自学生 WHERE timeOfClass IN ('W-7PM-A','W-8PM-A',...) 按时间分类

这将为您提供一个 SQL 查询,您可以循环遍历各行以获取各个计数。

【讨论】:

    【解决方案3】:

    where timeofclass in ("value 1, 'value 2'); 是正确的 sql 语法。您可以获取时间数组并创建 in 子句并将其连接到语句的末尾。您还可以创建一个存储过程来处理查询并将值的 CSV 作为参数。 高温

    【讨论】:

    • 你有一个双引号,它应该是一个单引号并且缺少一个单引号。 ("value 1, 'value 2') - 重写('value 1', 'value 2')
    猜你喜欢
    • 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
    相关资源
    最近更新 更多