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