我在数据库中有2个表
BRAND
- id
- name
PRODUCT
- id
- brand_id
- name
网站用户将仅使用一个文本字段搜索产品。
示例1:“sony dvd player”其中“sony”在BRAND表中,“dvd player”在PRODUCT表中。
示例2:“汽车音响先锋deh-1234”,本例中“汽车音响deh-1234”属于PRODUCT,是BRAND的先驱。
有没有办法编写搜索结果的唯一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的变量名,因为它来自一个单独的文本输入。
答案 0 :(得分:2)
它不起作用的原因是您在字符串中同时拥有品牌和产品信息。因此,如果您搜索“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 ...
必须动态生成表达式。然后,您可以通过一些“概率”值对结果进行排序,以使这些行在第一个具有更高匹配的位置。
答案 1 :(得分:0)
如果你重新考虑在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);
我还建议您更改查询以使用INNER JOIN,但这是另一回事。
对于排序,如果这对您很重要。我建议在每个单独的lastClause上将ORDER BY放在CASE的SUM上,其中match-> 1,不匹配 - > 0
答案 2 :(得分:0)
@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ñor; - )
<强>更新强>
@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)