搜索多个字段MySQL

时间:2015-04-12 00:49:51

标签: php mysql search pdo

我有一个这样的数据库:

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行。(我将模型和类型留空)

如果我在名称中搜索“Car”,在模型中搜索4,则返回第1,3行。(我离开Type为空)

如果我在Name中搜索“Car”,在Type中搜索“D”,则返回第3,4行(我离开模型为空)

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

这就是我所拥有的:

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:这有点难以解释,但我有一个表格。我想只有一个必填字段,另外两个是可选字段,但如果我还填写另外两个字段,它们就像一个过滤器。

因此需要名称字段(在表单中)。如果我只填写名称字段,它将只选择name =:name的位置。 如果我填写名称+模型,它将选择name =:name AND model =:model。 等等...

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

我不确定你的意思是"空白",但假设你的意思是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);

这个问题的问题在于,由于or条件,MySQL很难使用索引。如果您有大量数据,并且想要使用索引,那么您应该根据实际拥有数据的参数构造where子句。

答案 1 :(得分:3)

这是使用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,但是您需要查看是否已经设置了该值。