【问题标题】:Search multiple fields MySQL搜索多个字段 MySQL
【发布时间】:2026-01-25 22:25:02
【问题描述】:

我有一个这样的数据库:

ID | Name | Model | Type
1  | Car  | 4     | C
2  | Bar  | 2     | B
3  | Car  | 4     | D
4  | Car  | 3     | D

还有这样的表格:

Name : 
Model : 
Type :

现在,我只想搜索名称,例如“Car”,它会返回第 1、3、4 行。(我将 Model 和 Type 留空)

如果我在 Name 中搜索“Car”,在 Model 中搜索 4,它会返回第 1、3 行。(我将 Type 留空)

如果我在 Name 中搜索“Car”,在 Type 中搜索“D”,它会返回第 3、4 行(我将 Model 留空)

是否可以在一个查询中执行此操作?

这就是我所拥有的:

SELECT *
FROM items
WHERE (:name IS NOT NULL AND name = :name)
AND (:model IS NOT NULL AND model = :model)
AND (:type IS NOT NULL AND type = :type)

但它不起作用。 我只想在 3 个字段中填写 2 个,并且“WHERE”会适应并忽略空白字段。

编辑 1: 这有点难以解释,但我有一个表格。我只想有一个必填字段,另外两个是可选的,但如果我还填写另外一个或两个其他字段,它们就像一个过滤器。

所以名称字段是必需的(在表单中)。如果我只填写名称字段,它将仅选择名称 = :名称。 如果我填写名称+模型,它将选择名称=:名称和模型=:模型。 等等……

感谢您的帮助。

【问题讨论】:

  • 使用OR 而不是AND 作为附加参数。 (:name IS NOT NULL AND name = :name) OR (:model IS NOT NULL AND model = :model)
  • 您也可以将where 设为变量,然后通过条件仅添加您需要的值,并在条件中进行绑定。
  • @chris85 谢谢克里斯。 OR 的问题是,如果我在 Name 中搜索 Car 并在 Model 中搜索 4,甚至第 4 行(Car - 3)也会出现......

标签: php mysql search pdo


【解决方案1】:

我不确定您所说的“空白”是什么意思,但假设您的意思是 NULL,您可以这样做:

SELECT *
FROM items
WHERE (:name IS NULL OR name = :name) AND
      (:model IS NULL OR model = :model) AND
      (:type IS NULL OR type = :type);

这个查询的问题是 MySQL 很难为它使用索引,因为 or 条件。如果数据量很大,又想使用索引,那么应该根据实际有数据的参数来构造where子句。

【讨论】:

  • 这有点难以解释,但我有一个表格。我只想有一个必填字段,另外两个是可选的,但如果我还填写另外一个或两个其他字段,它们就像一个过滤器。
【解决方案2】:

这是使用 PHP 的另一种方法。您需要更新变量。

<?php
$query = 'SELECT *
FROM items
WHERE 1 = 1 ';
//below used for testing can be remove
//$_GET['name'] = 'test';
//$_GET['car'] = 'test2';
//$_GET['type'] = 'test3';
if(!empty($_GET['name'])) {
    $query .= ' and name = ? ';
    $params[] = $_GET['name'];
}
if(!empty($_GET['car'])) {
    $query .= ' and car = ? ';
    $params[] = $_GET['car'];
}
if(!empty($_GET['type'])) {
    $query .= ' and type = ? ';
    $params[] = $_GET['type'];
}
if(!empty($params)) {
    $dbh->prepare($query);
    $sth->execute($params);
    //fetch
} else {
    echo 'Missing Values';
}

1=1 是为了让您可以为每个字段附加一个值 and search field,否则您需要查看它是否已经设置。

【讨论】:

  • 这正是我的想法!我只需要用$sth = $dbh-&gt;prepare($query); 替换$dbh-&gt;prepare($query); 以避免变量错误。再次感谢!