1

我有 2 张桌子,faq 和 faq_categories...我参加了这项工作,到目前为止,我是一个快乐的露营者。

但是...要求改变了,我必须改变加入,但我不知道该怎么做

这是当前运行良好的代码:

SELECT faq.* , faq_categories.categoryname 
                                  FROM faq 
                                  JOIN faq_categories
                                  ON ( faq.catid = faq_categories.catid)

到目前为止,所有常见问题都属于一个类别......但是从现在开始,将有不属于任何类别的常见问题......这使事情变得复杂,至少对我来说。

我应该如何更改此代码以显示没有 catid 的常见问题解答?

这是我的表:

CREATE TABLE IF NOT EXISTS `faq_categories` (
`catid` int(11) NOT NULL AUTO_INCREMENT,
`parentid` int(11) DEFAULT NULL,
`categoryname` varchar(255) NOT NULL,
`categoryname_en` varchar(255) DEFAULT NULL,
`description` text,
`description_en` text,
`metatags` text,
`metatags_en` text,
`sorder` int(11) NOT NULL,
`visible` tinyint(4) NOT NULL,
`categoryphoto` varchar(255) DEFAULT '',
PRIMARY KEY (`catid`),
KEY `parentid_fk` (`parentid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=204 ;


CREATE TABLE IF NOT EXISTS `faq` (
`faqid` int(11) NOT NULL AUTO_INCREMENT,
`catid` int(11) DEFAULT NULL,
`question` text NOT NULL,
`question_en` text NOT NULL,
`answer` text,
`answer_en` text,
`metatags` text,
`metatags_en` text,
`sorder` tinyint(4) DEFAULT NULL,
`visible` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`faqid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
4

1 回答 1

1

对于那些没有类别的,我们假设您的意思faq.catidNULL. Your table definitions don't need to change at all. That will only require changing yourINNER JOIN to aLEFT JOIN . The FAQs with no category will show aNULL forfaq_categories.categoryname` 在输出中:

SELECT 
  faq.* , 
  faq_categories.categoryname 
FROM
  faq 
  LEFT JOIN faq_categories  ON ( faq.catid = faq_categories.catid)

但是,我现在鼓励您预测常见问题解答必须属于多个类别的时间。为此,您需要创建一个包含 afaqid和的连接表catid。每个可以有很多行faqid

CREATE TABLE faq_in_categories (
  faqid INT(11) NOT NULL,
  catid INT(11) NOT NULL,
  PRIMARY KEY (faqid, catid),
  FOREIGN KEY (faqid) REFERENCES faq (faqid),
  FOREIGN KEY (catid) REFERENCES faq_categories (catid)
);

在此模型下,您将删除该faq.catid列,因为类别中的成员资格是在联接表中定义的。这是一个多对多的关系

查询人:

SELECT 
  faq.*
  categories.*
FROM
  faq
  JOIN faq_in_categories ON faq.faqid = faq_in_categories.faqid
  JOIN categories ON faq_in_categories.catid = categories.catid
WHERE faq.faqid = 'some faqid'
于 2012-10-12T23:28:07.000 回答