2012-02-13 88 views
1

我现在有数据库设置像这样:GROUP_CONCAT或替代结果

CREATE TABLE `article` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` int(11) NOT NULL, 
    `body` int(11) NOT NULL, 
    `link` int(11) NOT NULL, 
    `date` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE `translation_pivot` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `content` text, 
    PRIMARY KEY (`id`) 
) 

这是一个相当简化的版本来说明问题,本质上是translation_pivot用于进一步查找文本字符串来自一系列语言表,但这不相关。这里,article中的title,bodylink列包含来自translation_pivot的引用content的id。

难点在于做一个INNER JOIN会产生一个名为content的列,它将只包含来自translation_pivot的第一个匹配,在这种情况下为title

我看过的其他选项是使用translation_pivot.content上的GROUP_CONCAT。这将工作,但随后我留下一个用逗号分隔的项目列表,并且与第一项,第二项和第三项(这是可以的,但不是很好的)不同,它与title,bodylink之间的关系明显失去。更严重的问题是,翻译中的项目可能是几段文字。 group_concat_max_len的默认值是1024,我可以更改它,但是如果设置为高值,会不会影响性能?

理想我想从translation_pivot与文本结果更换titlebodylink列,或至少得到的文本内容回针对每个作为一个单独的列的方式。这可能在一个单一的查询?

我的另一种方法是以翻译_pivot的id作为键值,将键值对作为数组检索,然后在查询文章后进行查找。这只是一个额外的查询,可能更简单一些。

哪种解决方案最适合放大?还是有什么我失踪?

回答

2

只是做多的加入:

SELECT 
    article.id AS id, 
    tptitle.content AS title, 
    tpbody.content AS body, 
    tplink.content AS link, 
    article.`date` AS `date` 
FROM 
    article 
    INNER jOIN translation_pivot AS tptitle ON article.title=tptitle.id 
    INNER jOIN translation_pivot AS tpbody ON article.body=tpbody.id 
    INNER jOIN translation_pivot AS tplink ON article.link=tplink.id 

或:

SELECT 
    article.id AS id, 
    IFNULL(tptitle.content,'DEFAULT TITLE') AS title, 
    IFNULL(tpbody.content, 'DEFAULT BODY') AS body, 
    IFNULL(tplink.content, 'DEFAULT LINK') AS link, 
    article.`date` AS `date` 
FROM 
    article 
    LEFT jOIN translation_pivot AS tptitle ON article.title=tptitle.id 
    LEFT jOIN translation_pivot AS tpbody ON article.body=tpbody.id 
    LEFT jOIN translation_pivot AS tplink ON article.link=tplink.id 
+0

+1瞬间!但是,不确定是否总会有标题,正文和链接值填充。 – 2012-02-13 15:09:04

+0

在这种情况下,你需要一个左连接而不是内连接,编辑我的答案 – 2012-02-13 15:11:47

+0

啊,我刚刚看到你的回答:快回来! +1 – 2012-02-13 15:13:37

2

链接到translation_pivot表中的每个标题,正文和纽带 - 像这样:

select a.`id`, 
     a.`date`, 
     t.`content` title_content, 
     b.`content` body_content, 
     l.`content` link_content 
from `article` a 
left join `translation_pivot` t on a.`title` = t.`id` 
left join `translation_pivot` b on a.`body` = b.`id` 
left join `translation_pivot` l on a.`link` = l.`id`