Mysql选择组合表/字段

时间:2010-12-13 18:12:20

标签: php sql mysql

我在数据库中有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的变量名,因为它来自一个单独的文本输入。

3 个答案:

答案 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)