昨天一个kphp团队的学员向我请教了一个关联字段查询的问题,这个同学在做一个企业网站,对于企业网站kphp开源框架已经帮助他完成了80%了,一些基本企业信息发布需求都能实现,而这位学员的客户想实现发布的新闻和企业的主营项目关联,可以实现一对多关联,即当网站的来访者点击到项目页时候,项目页的左侧会展示和项目关联的新闻,这样有利于来访者更好阅读项目和企业新闻,其实这个也很简单,只需要加个字段,运用mysql的find_in_set()就很容易搞定了。
第一,在新闻表中加一个关联字段
字段object_id_str为varchar类型因为企业站而且客户的项目也有限给500个字节就ok了,保存项目的id字符串如"123,21,32",添加新闻时候做个多选把项目展示出来,进行选择关联保存到数据库。
第二,数据库保存完毕,现在就需要查询关联,在项目页取得项目id和 新闻表中的object_id_str进行关联读取新闻信息。
首先想到的是like 查询。
like 模糊查询可以说能实现80%的查询需求,
但对于这个案例还是没有实现,原因字段中保存的项目id值直接有包含的,比如 id是 12,和121,当使用like查询 id为12时候,也会把 121的id值查出来,此方法行不通。当时开始想会不会有这样的函数,可以实现我的要求,功夫不负有心人,经过查找,找到了 mysql字符串函数find_in_set()函数
这个函数是以","为分隔符,而对每一项进行对比的,正好适合我的查询要求,分析一下就是通过项目id值与新闻表中的关联字段,即字项目id是字符串,
select * from news_info where find_in_set('1',object_id_str)。
特别注意:mysql字符串函数 find_in_set(条件字段/字符串,资源字段/字符串),函数是返回[资源字段/字符串]中[条件字段/字符串]所在的位置索引,[资源字段/字符串]必须以","分割开。如果你的关联栏目字段id字符串中id超出20个那建议不用find_in_set,那样效率会很低,因为这个项目是企业站,那么这个mysql的find_in_set()函数是非常好的选择。
原文转自kphp开源框架: http://www.kphp.org/?faq-show-48.html
第一,在新闻表中加一个关联字段
字段object_id_str为varchar类型因为企业站而且客户的项目也有限给500个字节就ok了,保存项目的id字符串如"123,21,32",添加新闻时候做个多选把项目展示出来,进行选择关联保存到数据库。
第二,数据库保存完毕,现在就需要查询关联,在项目页取得项目id和 新闻表中的object_id_str进行关联读取新闻信息。
首先想到的是like 查询。
like 模糊查询可以说能实现80%的查询需求,
但对于这个案例还是没有实现,原因字段中保存的项目id值直接有包含的,比如 id是 12,和121,当使用like查询 id为12时候,也会把 121的id值查出来,此方法行不通。当时开始想会不会有这样的函数,可以实现我的要求,功夫不负有心人,经过查找,找到了 mysql字符串函数find_in_set()函数
这个函数是以","为分隔符,而对每一项进行对比的,正好适合我的查询要求,分析一下就是通过项目id值与新闻表中的关联字段,即字项目id是字符串,
select * from news_info where find_in_set('1',object_id_str)。
特别注意:mysql字符串函数 find_in_set(条件字段/字符串,资源字段/字符串),函数是返回[资源字段/字符串]中[条件字段/字符串]所在的位置索引,[资源字段/字符串]必须以","分割开。如果你的关联栏目字段id字符串中id超出20个那建议不用find_in_set,那样效率会很低,因为这个项目是企业站,那么这个mysql的find_in_set()函数是非常好的选择。
原文转自kphp开源框架: http://www.kphp.org/?faq-show-48.html