【问题标题】:How to query specific category or all categories inside the same query?如何在同一查询中查询特定类别或所有类别?
【发布时间】:2013-10-07 02:50:30
【问题描述】:

我有一个列名为“类别”的表。在 PHP 中,我使用 sql prepare 语句来选择属于指定类别的所有记录。我用 category=?然后添加具有类别值的变量。这很好用。

但是,如何在同一个查询中选择所有类别?

我尝试使用 null 和 '' 作为类别值,但这不起作用。为另一个查询复制整个代码部分可能会创建 spagetti 代码,因此我想知道是否有更好的选择。有吗?

谢谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    基于 @JamesMarks 提供的内容,使用类似的查询会更简单

    $query = "SELECT * FROM table WHERE category = ? OR 1 = ?;"
    

    然后将您的 $category 传递给第一个参数,并将 1 或 0 作为第二个参数。如果通过 1,则第二项变为 1 = 1。这总是正确的,所以整个表达式总是正确的。如果传递 0,则第二项是 1 = 0,这始终是错误的,但只有当 category = $category 匹配时,整个表达式才会为真。

    这比为“任何类别”指定特殊值 0 更简单、更好。

    另一种解决方案是动态构建查询:

    $where = array();
    if ($category) {
        $where[] = "category = ?";
        $params[] = $category;
    }
    
    ... perhaps add more terms to $where conditionally ...
    
    $query = "SELECT * FROM table";
    if ($where) {
        $query .= " WHERE " . implode(" AND ", $where);
    }
    

    【讨论】:

      【解决方案2】:

      假设您有一个自动生成的 ID(AUTO_INCREMENT 或 IDENTITY,取决于您的数据库引擎),您可以使用类似于以下内容的 WHERE 子句。

      $query = "SELECT * FROM table WHERE category = $category OR $category = 0;"

      当您想要“所有类别”时,只需将值 0 传递给您的 $category 变量即可。

      如果您不想为 $category 传递值,而是希望能够传递一个空白 $category,则可以在构建查询字符串之前将 $category 设置为 0:

      $category = (empty($category) ? "0" : $category); $query = "SELECT * FROM table WHERE category = $category OR $category = 0;";

      ...或者您可以在一行上重写,如下所示。

      $query = "SELECT * FROM table WHERE category = $category OR" 。 (空($category)?“0”:$category)。 " = 0;"

      【讨论】:

      • 我还不明白。您正在使用 $category 两次, $category = 0 将选择一个特定的类别而不是全部。我错过了什么?
      • 我现在明白了,但您的解决方案不起作用。 OR 部分总是被执行。如果指定了其他所有类别,我想要一个特定类别。
      • 如果您不想为所有类别指定 0(零),您可以将查询修改为如下所示:$query = "SELECT * FROM table WHERE category = $category OR"。 (!empty($category)?$category:"0")." = 0";
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2011-12-14
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多