使用mySQL将密钥链接到多个条目

时间:2013-02-10 10:09:27

标签: mysql regex search key unique

我正在为我的网站创建一个搜索功能,因此我从主表中获取了关键字,并将这些关键字汇总到通过id链接到主表的辅助表中。 我的设置如下:
-------------------------------------------------- ---
|项目|
-------------------------------------------------- ---
| Id |名称|价格|
-------------------------------------------------- ---
| 1 | CPU | 199.95 |
| 2 | GPU | 249.95 |
| 3 | GPU | 225.95 |
-------------------------------------------------- ---

-------------------------------------------------- ---
| KEYS |
-------------------------------------------------- ---
| Id | item_name | item_id |
-------------------------------------------------- ---
| 1 | CPU | 1 |
| 2 | GPU | 2 |
| 3 | GPU | 3 |
-------------------------------------------------- ---
请记住,我的表格更复杂,每行产生许多键 我的问题是,如果有很多重复的关键字,关键字表变得非常大。因此,我的问题是: 是否有可能以某种方式将mySQL中的id分组为每个唯一的item_name,所以如果有人搜索GPU,那么输出将是2和3?
我想你可以使用eg分隔字符串中的值。像这样的逗号:
-------------------------------------------------- ---
| 2 | GPU | 2,3 |
-------------------------------------------------- ---
但是我觉得它很复杂,例如项目中的项目被删除,我需要更新我的密钥表,并可能从字符串“1,3,5,7,10,15”中删除Id = 5 ... <登记/> 是否有一种将同名密钥链接到多个条目的智能方法?或者我是否总是需要一个正则表达式,甚至PHP,来分隔值?

1 个答案:

答案 0 :(得分: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

请注意,这与正则表达式无关。