1
4

3 回答 3

4

即使另一个答案被接受了......我对这个想法进行了更多解释,因为我觉得它符合“最佳实践”,并允许您将多个单词与一个项目相关联,同时不重复数据。

您最终应该得到三个表:

item:        item_id | Brand | model |additional products | price 

word:        word_id | word 

item_word:   item_word_id | item_id | word_id 

数据看起来像:

物品:

item_id   brand     model        additional_products   price 
1         nokia     g5                                   100 
2         toshiba   satellite                           1000 

单词:

word_id   word 
1         1 GB
2         ATA
3         SATA
4         512BG RAM 

item_word:

item_word_id    itwm_id     word_id
1               1           1
2               1           2
3               2           3
4               2           4

所以nokia有这些话:1 GB, ATAtoshiba有这些话:SATA, 512BG RAM。(我意识到这没有多大意义,这只是一个例子)


然后像这样查询..

select  item.*, word 

from    item 

        join item_word on item.item_id = item_word.item_id

        join word on item_word.word_id = word.word_id 

并像...一样过滤它

select  item.*, word 

from    item 

        join item_word on item.item_id = item_word.item_id

        join word on item_word.word_id = word.word_id 

 where  word in ('1GB RAM', '512GB RAM', 'ATA')

看看你甚至可以尝试的最相关的结果是什么......

select  item.item_id, item.brand, item.model, count(*) as word_count

from    item 

        join item_word on item.item_id = item_word.item_id

        join word on item_word.word_id = word.word_id 

 where  word in ('1GB RAM', '512GB RAM', 'ATA')

 group  by item.item_id, item.brand, item.model

 order  by count(*) desc 

对于与提供的所有单词匹配的内容,您将使用...

select  item.item_id, item.brand, item.model, count(*) as word_count

from    item 

        join item_word on item.item_id = item_word.item_id

        join word on item_word.word_id = word.word_id 

 where  word in ('1GB RAM', 'ATA')

 group  by item.item_id, item.brand, item.model

 having count(*)=2

in其中 3 是您的陈述中的字数word in ('1GB RAM', 'ATA')...... 在这种情况下,它是2


如果你只是...

item:  Brand | model |additional products | price | long_word_string

那你必须做...

 select  * 
 from    item 
 where   long_word_string like '1GB RAM' or word like 'ATA'

甚至...

 select  * 
 from    item 
 where   long_word_string regexp '1GB RAM|ATA'

但这些是非常低效/昂贵的方法......最好只是规范化事物,这样你就不会存储额外的数据并降低性能试图让它出来

那有意义吗?它回答了你的问题吗?

编辑:我的答案只输给了两张表……我现在担心 OP 的数据库。

于 2013-11-06T19:10:30.600 回答
2

将您的搜索词存储在永无止境的附加列中与数据库“规范化”是违反直觉的。将所有内容存储在一列中通常是最后一个选项,因为如果您使用多列,则更容易分解搜索词。

制作一个单独的表并将您的原始表连接到该表。你的结构看起来像这样:

原表

在此处输入图像描述

新表

在此处输入图像描述

我在您的原始表中添加了一个主键列。这将使 JOIN 更容易。使用以下语句连接两个表:

SELECT original_table.*
FROM original_table AS ABB2
    JOIN new_table AS ABB1 ON ABB1.product_id = ABB2.id
WHERE search_word = "your search term"

新表中的“search_word”列是与原始表中的每个条目相关联的术语。

如果您希望启用模糊(返回包含您的搜索词的所有结果)搜索,您可以在 WHERE 语句中添加“%”通配符。

于 2013-11-06T19:16:26.670 回答
0

感谢所有的建议。它非常有帮助。我想我会尝试使用单独的表格来查找关键词,但我不确定如何编写这部分代码,所以我也将开始学习 :)

于 2013-11-07T07:28:17.257 回答