繁体   English   中英

从mysql行返回所有结果,并以逗号分隔,匹配值

[英]return all results from a mysql row seperated by commas matching a value

我有一个包含新闻数据和类别的mysql表,我试图选择某个类别中的所有数据。 我没有想到足够远,所以我目前在某个时候不使用标准化表,我可能会回去重新编写该部分以使用标准化表。

这是我的表结构

+---------+------------+------------+--------+----------+   
| news_id | news_title | news       | cat_id | date     |      
+---------+------------+------------+--------+----------+    
| 1       | title1     | blahblah   |1,2,4,6 |2009-11-24|                    
+---------+------------+------------+--------+----------+
| 2       | new title  | text 123   | 2      |2009-01-24|                    
+---------+------------+------------+--------+----------+ 
| 3       | new title3 | text 3     | 2,19,6 |2009-02-24|                    
+---------+------------+------------+--------+----------+   

假设我要返回类别2的所有结果,而我试图使用此语句。

$query= mysql_query("SELECT id FROM `news_data` WHERE FIND_IN_SET('" . str_replace(',',"',cat_id) OR FIND_IN_SET('",$cat_id)."',cat_id)") or die(mysql_error());

这将返回新闻ID 2和3的结果,因为它们都以“ 2”开头。 未选择第一个新闻ID,因为“ 2”是第二个值。 我知道mysql语句有一些简单的错误,我希望有人能够帮助我。

谢谢,布鲁克

只需删除find_in_set中数字的引号即可。 为我工作。

" WHERE FIND_IN_SET(" . str_replace(',',",cat_id) OR FIND_IN_SET(",$cat_id).",cat_id)")

另一个很酷的方法:

select id from news_data where cat_id regexp '(^|[^0-9])2([^0-9]|$)';

...可以使用任何定界符/间距。

除了其他出色的答案

这是一个糟糕的设计。 它违反了架构设计的规范化规则之一(第一?第二?我不记得了)。

这是一个多对多的关系,因为它看起来像一个新闻条目可以具有许多类别,并且一个类别可以属于许多新闻条目。 这样建模,您将拥有更好的设计。

采用:

 WHERE INSTR(CONCAT(t.cat_id, ','), '2,') > 0

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM