Php 如何根据类别中的匹配项从数据库中进行选择?

Php 如何根据类别中的匹配项从数据库中进行选择?,php,mysql,database,mysqli,Php,Mysql,Database,Mysqli,当条目中有多个类别时,是否可以根据与其匹配的类别选择某些行?这很难解释,所以我给你看。我在数据库中的行如下所示: **article_title** | **article_content** | **category** Article-1 | some content here | one,two,three,four $sql = mysqli_query($mysqli_connect, "SELECT * FROM tab

当条目中有多个类别时,是否可以根据与其匹配的类别选择某些行?这很难解释,所以我给你看。我在数据库中的行如下所示:

**article_title**   |   **article_content**    |    **category**

Article-1           |   some content here      |    one,two,three,four
$sql = mysqli_query($mysqli_connect, "SELECT * FROM table WHERE category='
preg_match(for example the word three)'");
因此,我的查询如下所示:

**article_title**   |   **article_content**    |    **category**

Article-1           |   some content here      |    one,two,three,four
$sql = mysqli_query($mysqli_connect, "SELECT * FROM table WHERE category='
preg_match(for example the word three)'");

我这样做的原因是,一些文章将出现在多个页面上,如第1页和第3页……那么有没有办法通过数据库行中的条目匹配我要查找的内容?

您应该使用更灵活的数据库设计。创建一个单独的表,其中包含(一)个项目和(多)个类别之间的一对多关系:

CREATE TABLE IF NOT EXISTS `articles` (
  `article_id` int(11) NOT NULL AUTO_INCREMENT,
  `article_name` varchar(255) NOT NULL,
  PRIMARY KEY (`article_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `articles` (`article_id`, `article_name`) VALUES
(1, 'Research Normalized Database Design');

CREATE TABLE IF NOT EXISTS `article_category` (
  `article_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `article_category` (`article_id`, `category_id`) VALUES
(1, 1),
(1, 2);

CREATE TABLE IF NOT EXISTS `categories` (
  `category_id` int(11) NOT NULL AUTO_INCREMENT,
  `category_name` varchar(255) NOT NULL,
  PRIMARY KEY (`category_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `categories` (`category_id`, `category_name`) VALUES
(1, 'Databases'),
(2, 'Normalization');
然后,查询变得非常简单:

SELECT 
    *
FROM 
    articles AS a
JOIN 
    article_category AS pivot ON a.article_id = pivot.article_id 
WHERE 
    pivot.category_id = 2
或者像这样做:

SELECT 
    *
FROM 
    articles AS a
JOIN 
    article_category AS pivot ON a.article_id = pivot.article_id 
JOIN 
    categories AS c ON pivot.category_id = c.category_id
WHERE 
    c.category_name = 'Normalization'

关于普通数据库设计的第100500个问题……这正是为什么您不应该对类别执行此=>
1、2、3、4
。在过去的两周里,我见过多少次这种类型的数据库管理,人们来问我们“如何”…感谢guysTry的帮助,并改用
where in
。但是你真的不应该这样设计你的数据库结构。现在你知道这对你来说是多么的“痛苦”。相信我,我现在知道了颈部疼痛的感觉。我建议你改为设置不同的类别/栏目。它会让你的生活变得更轻松;-)