3 回答
即使另一个答案被接受了......我对这个想法进行了更多解释,因为我觉得它符合“最佳实践”,并允许您将多个单词与一个项目相关联,同时不重复数据。
您最终应该得到三个表:
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, ATA
和toshiba
有这些话: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 的数据库。
将您的搜索词存储在永无止境的附加列中与数据库“规范化”是违反直觉的。将所有内容存储在一列中通常是最后一个选项,因为如果您使用多列,则更容易分解搜索词。
制作一个单独的表并将您的原始表连接到该表。你的结构看起来像这样:
原表
新表
我在您的原始表中添加了一个主键列。这将使 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 语句中添加“%”通配符。
感谢所有的建议。它非常有帮助。我想我会尝试使用单独的表格来查找关键词,但我不确定如何编写这部分代码,所以我也将开始学习 :)