我目前有这样的数据库设置:
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用于从一系列语言表中进一步查找文本字符串,但这是不相关的。此处,title
中的body
,link
和article
列包含引用content
translation_pivot
的ID。
难点在于,进行INNER JOIN会产生一个名为content
的列,该列仅包含来自translation_pivot
的第一个匹配项,在本例中为title
。
我调查的另一个选项是在translation_pivot.content
上使用GROUP_CONCAT。这会有效,但之后我会留下逗号分隔的项目列表,除了作为第一,第二和第三项之外,与title
,body
和link
失去明显的关系(哪个好,但不是很好。更严重的问题是翻译中的项目可以是几段文本。 group_concat_max_len的默认值是1024,我可以更改但如果设置为高值会对性能产生影响吗?
理想情况下,我想要一种用title
的文本结果替换body
,link
和translation_pivot
列,或者至少获取文本内容的方法每个作为一个单独的列。这可能在一个查询中吗?
我的另一种选择是将关键值对作为数组从translation_pivot中以id作为键检索,然后在查询文章后进行查找。这只是一个额外的查询,可能更简单。
哪种解决方案最适合?或者还有其他我想念的东西?
答案 0 :(得分: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
答案 1 :(得分: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`