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

时间:2013-12-02 20:26:01

标签: 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 table WHERE category='
preg_match(for example the word three)'");

为什么我这样做是因为有些文章可以在第一页和第三页等多个页面上使用...那么有没有办法通过数据库行中的条目来匹配我正在寻找的内容? / p>

1 个答案:

答案 0 :(得分:1)

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

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'