MySQL选择列表在数组中

时间:2011-09-16 17:18:20

标签: php mysql arrays select

每篇文章都可以有无限的类别。

类别会像这样保存在数据库中

示例article_category:'1','3','8'

OR

示例article_category:'2','3'

因此,当我搜索下面的列表时,可以说类别3

$category_id = $_REQUEST['category_id'];  //3
$SQL = "SELECT * FROM ARTICLES WHERE article_category = '$category_id'";

如果它只是一个上面会工作正常。

我不想说,但我完全迷失了......我会使用IN吗?

3 个答案:

答案 0 :(得分:1)

=(等于)检查完整的字符串。您想要做什么可以使用LIKE和%comodin完成(就像dir中的文件一样*)

$SQL = "SELECT * FROM ARTICLES WHERE article_category LIKE \"%'$category_id'%\"";

但是,我建议您规范化数据库并将类别作为子表

答案 1 :(得分:1)

我实现这一点的方法是为类别创建一个表,您可能已经拥有了这个表。类似的东西:

cat_id    cat_name
1         animals
2         sports
3         locations

然后创建一个表格以将文章链接到类别。类似的东西:

table artcat
article_id    cat_id
1             1
1             3
2             1
2             2
2             3

上表基本上取代了您当前的字段article_category。在上面的例子中

article 1 is linked to categories 1 and 3
article 2 is linked to categories 1, 2 and 3

当您需要获取给定类别的所有文章时,您只需运行以下查询:

SELECT article_id FROM artcat WHERE cat_id=3

如果愿意,您甚至可以与文章数据库连接以输出文章标题。

我希望这会有所帮助。祝你好运!

答案 2 :(得分:0)

您可以在此处使用FIND_IN_SET,但效率可能不高。我建议您更改表格结构并按照@jdias的回答。

如果您的article_category保存为1,2,3

$SQL = "SELECT * FROM ARTICLES WHERE FIND_IN_SET('$category_id', article_category)";

或者如果它保存为'1','2','3'

$SQL = "SELECT * FROM ARTICLES WHERE FIND_IN_SET('\'$category_id\'', article_category)";