我正在为我的网站创建一个搜索功能,因此我从主表中获取了关键字,并将它们总结为通过 id 链接到主表的辅助表中的键。
我的设置如下所示:
-------------------------------------------- ---------
| 物品 |
-------------------------------------------------- ---
| 身份证 | 姓名 | 价格 |
-------------------------------------------------- ---
| 1 | 中央处理器 | 199.95 |
| 2 | 显卡 | 249.95 |
| 3 | 显卡 | 225.95 |
-------------------------------------------------- ---
------------------------------------------------------------ ------
| 键 |
-------------------------------------------------- ---
| 身份证 | 项目名称 | item_id |
-------------------------------------------------- ---
| 1 | 中央处理器 | 1 |
| 2 | 显卡 | 2 |
| 3 | 显卡 | 3 |
-------------------------------------------------- ---
请记住我的表更复杂,为每一行生成许多键。
我的问题是,如果有很多重复的关键字,关键字表会变得非常大。因此,我的问题是:
是否有可能以某种方式将 mySQL 中的每个唯一 item_name 的 id 分组,所以如果有人搜索 GPU,输出将是 2 和 3?
我认为您可以使用例如分隔字符串中的值。像这样的逗号:
--------------------------------------------- --------
| 2 | 显卡 | 2,3 |
-------------------------------------------------- ---
但是,我觉得当项目中的一个项目被删除并且我需要更新我的键表并可能从字符串“1,3,5,7,10,15”中删除一个 Id=5 时,它会变得复杂......
是有一种将同名键链接到多个条目的聪明方法吗?或者我是否总是需要一个正则表达式,甚至可能是 PHP,来分隔这些值?
问问题
46 次
1 回答
0
不要在数据库表中使用 CSV,而是使用连接来选择数据。
您应该能够像这样生成输出:
select count(*) as cnt
,k.item_name
,group_concat(k.item_id) as ids
from keys k
inner join items i ON (i.id = k.id)
where i.price = 199.95
将group_concat
即时生成 CSV,因此您不必将 CSV 存储在数据库中。如果需要多行输出,可以使用group by
子句。
请参阅:http ://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
请注意,这与正则表达式无关。
于 2013-02-10T10:22:09.600 回答