在mysql中更改连接

时间:2012-10-12 23:24:08

标签: mysql sql join

我有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 ;

1 个答案:

答案 0 :(得分:1)

对于那些没有类别的人,我们假设你的意思是faq.catid将是NULL. Your table definitions don't need to change at all. That will only require changing your INNER JOIN to a LEFT JOIN . The FAQs with no category will show a NULL for faq_categories.categoryname`在输出中:

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

我鼓励您现在预测常见问题解答必须属于多个类别的时间。为此,您需要创建一个包含faqidcatid的连接表。每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'