返回由逗号匹配的mysql行的所有结果

时间:2010-01-01 00:14:56

标签: php mysql

我有一个包含新闻数据和类别的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语句有一些简单的错误,我希望有人能够帮助我。

谢谢, 布鲁克

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

另一种很酷的方式:

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

...适用于任何分隔符/间距。

除了其他优秀的答案

答案 2 :(得分:1)

这是一个糟糕的设计。它打破了架构设计的规范化规则之一(第一个?第二个?我无法回想起)。

这是一种多对多的关系,因为它看起来像一个新闻项目可以有许多类别,一个类别可以属于许多新闻项目。以这种方式建模,你会有更好的设计。

答案 3 :(得分:1)

使用:

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

参考: