首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql选择组合表/字段

Mysql选择组合表/字段
EN

Stack Overflow用户
提问于 2010-12-14 02:12:20
回答 3查看 609关注 0票数 2

我在数据库中有两个表

代码语言:javascript
运行
复制
BRAND
- id
- name

PRODUCT
- id
- brand_id
- name

网站用户将只使用一个文本字段搜索产品。

示例1:"sony dvd player“,其中"sony”在品牌表中,"dvd player“在产品表中。

示例2:“汽车音频先锋deh-1234",在这种情况下,”汽车音频deh-1234“属于产品,先锋到品牌。

有没有办法编写一个唯一的SQL查询来搜索结果?

如下所示:

代码语言:javascript
运行
复制
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的变量名,因为它来自一个简单的文本输入。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-14 02:36:44

如果您重新考虑哪些部分是用PHP完成的,哪些部分是用SQL完成的,这就相当简单了

-PHP--

代码语言:javascript
运行
复制
$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

票数 0
EN

Stack Overflow用户

发布于 2010-12-14 02:37:20

它不起作用的原因是字符串中既有品牌信息又有产品信息。因此,如果您搜索"sony dvd player“,则查询将在这两个表中搜索"%sony dvd player%"。但可能没有这样的条目(无论是在brand中还是在product中)。

相反,您应该拆分搜索字符串,并“单独”搜索部件。例如:

代码语言:javascript
运行
复制
P.name LIKE '%sony%' OR p.name LIKE '%dvd%' OR p.name LIKE '%player%' OR b.name LIKE ...

表达式必须是动态生成的。然后,您可以按某个“概率”值对结果进行排序,以使那些匹配度较高的行位于第一个位置。

票数 2
EN

Stack Overflow用户

发布于 2010-12-14 02:37:55

@gustyaquino:你的代码应该可以工作,只需要一个小的更新--

代码语言:javascript
运行
复制
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的编辑,回来后看到你跳到我身上,否决我的投票。

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4432028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档