搜索多个字段 MySQL
Search multiple fields MySQL
我有一个这样的数据库:
ID | Name | Model | Type
1 | Car | 4 | C
2 | Bar | 2 | B
3 | Car | 4 | D
4 | Car | 3 | D
还有这样的表格:
Name :
Model :
Type :
现在,我只想搜索名称,例如 "Car" 和 returns 第 1、3、4 行。(我将型号和类型留空)
如果我在名称中搜索 "Car",在模型中搜索 4,它会 returns 第 1、3 行。(我将类型留空)
如果我在名称中搜索 "Car" 并在类型中搜索 "D",它 returns 第 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 的地方 select。
如果我填写姓名 + 型号,它将 select 其中姓名 = :name AND model = :model。
等等...
感谢您的帮助。
我不确定你所说的 "blank" 是什么意思,但假设你的意思是 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
子句。
这是使用 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
值,否则您需要查看它是否已经设置。
我有一个这样的数据库:
ID | Name | Model | Type
1 | Car | 4 | C
2 | Bar | 2 | B
3 | Car | 4 | D
4 | Car | 3 | D
还有这样的表格:
Name :
Model :
Type :
现在,我只想搜索名称,例如 "Car" 和 returns 第 1、3、4 行。(我将型号和类型留空)
如果我在名称中搜索 "Car",在模型中搜索 4,它会 returns 第 1、3 行。(我将类型留空)
如果我在名称中搜索 "Car" 并在类型中搜索 "D",它 returns 第 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 的地方 select。 如果我填写姓名 + 型号,它将 select 其中姓名 = :name AND model = :model。 等等...
感谢您的帮助。
我不确定你所说的 "blank" 是什么意思,但假设你的意思是 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
子句。
这是使用 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
值,否则您需要查看它是否已经设置。