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