我在数据库中有两个表
BRAND
- id
- name
PRODUCT
- id
- brand_id
- name
网站用户将只使用一个文本字段搜索产品。
示例1:"sony dvd player“,其中"sony”在品牌表中,"dvd player“在产品表中。
示例2:“汽车音频先锋deh-1234",在这种情况下,”汽车音频deh-1234“属于产品,先锋到品牌。
有没有办法编写一个唯一的SQL查询来搜索结果?
如下所示:
SELECT
B.name,P.name
FROM
brand B,product P
WHERE
B.id=P.brand_id
AND (P.nombre LIKE '%{$textfield}%' OR B.name LIKE '%{textfield}%')
谢谢你的帮助。:)
编辑:上面的SQL不适用于组合的品牌/产品,但适用于产品或品牌。我编辑了用于$textfield的变量名,因为它来自一个简单的文本输入。
发布于 2010-12-14 02:36:44
如果您重新考虑哪些部分是用PHP完成的,哪些部分是用SQL完成的,这就相当简单了
-PHP--
$t = $_POST('textField1');
$tArr = explode(' ', $t);
$lastClause = '';
foreach ($tArr as $k=>$v)
{
if ($k != 0) $lastClause .= ' OR ';
$lastClause .= " B.name LIKE '%$v%' OR P.name LIKE '%$v%' ";
}
$sql = "SELECT B.name,P.name
FROM
brand B,product P
WHERE
B.id=P.brand_id
AND ($lastClause)";
mysql_query($sql, $conn);
我还建议您将查询更改为使用内部连接,但这是另一回事。
至于排序,如果这对你很重要的话。我建议对每个单独的lastClause块上的大小写求和进行排序,其中匹配-> 1,不匹配-> 0
发布于 2010-12-14 02:37:20
它不起作用的原因是字符串中既有品牌信息又有产品信息。因此,如果您搜索"sony dvd player“,则查询将在这两个表中搜索"%sony dvd player%"
。但可能没有这样的条目(无论是在brand
中还是在product
中)。
相反,您应该拆分搜索字符串,并“单独”搜索部件。例如:
P.name LIKE '%sony%' OR p.name LIKE '%dvd%' OR p.name LIKE '%player%' OR b.name LIKE ...
表达式必须是动态生成的。然后,您可以按某个“概率”值对结果进行排序,以使那些匹配度较高的行位于第一个位置。
发布于 2010-12-14 02:37:55
@gustyaquino:你的代码应该可以工作,只需要一个小的更新--
SELECT
B.name,P.name
FROM
brand B,product P
WHERE
B.id = P.brand_id
AND (P.name LIKE '%{$textfield}%' OR B.name LIKE '%{textfield}%')
将nombre
替换为name
,se ;-)
更新
@hol:我在shell中测试了SQL代码,它可以工作。我只是在我回答后才注意到gustyaquino的编辑,回来后看到你跳到我身上,否决我的投票。
mysql> create database so4432028;
Query OK, 1 row affected (0.16 sec)
mysql> use so4432028;
Database changed
mysql> create table brand (id int not null auto_increment,
name varchar(20) not null default '',
primary key(`id`));
Query OK, 0 rows affected (0.34 sec)
mysql> create table product (id int not null
auto_increment, name varchar(40) not null default '',
brand_id int not null, primary key(`id`),
key brand (`brand_id`));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into brand (name) values ('Sony');
Query OK, 1 row affected (0.08 sec)
mysql> insert into brand (name) values ('LG');
Query OK, 1 row affected (0.02 sec)
mysql> insert into brand (name) values ('Panasonic');
Query OK, 1 row affected (0.01 sec)
mysql> insert into product (name, brand_id) values ('DVD Player', 1);
Query OK, 1 row affected (0.09 sec)
mysql> insert into product (name, brand_id) values ('Plasma Television', 2);
Query OK, 1 row affected (0.06 sec)
mysql> insert into product (name, brand_id) values ('CD Player', 3);
Query OK, 1 row affected (0.03 sec)
mysql> select p.name, b.name from brand b, product p where b.id = p.brand_id and
(p.name like '%Sony%' OR b.name LIKE '%Sony%');
+------------+------+
| name | name |
+------------+------+
| DVD Player | Sony |
+------------+------+
1 row in set (0.09 sec)
https://stackoverflow.com/questions/4432028
复制相似问题