GROUP_CONCAT或用于对多个MySQL结果进行分组的替代方法

时间:2012-02-13 14:59:35

标签: php mysql

我目前有这样的数据库设置:

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中的bodylinkarticle列包含引用content translation_pivot的ID。

难点在于,进行INNER JOIN会产生一个名为content的列,该列仅包含来自translation_pivot的第一个匹配项,在本例中为title

我调查的另一个选项是在translation_pivot.content上使用GROUP_CONCAT。这会有效,但之后我会留下逗号分隔的项目列表,除了作为第一,第二和第三项之外,与titlebodylink失去明显的关系(哪个好,但不是很好。更严重的问题是翻译中的项目可以是几段文本。 group_concat_max_len的默认值是1024,我可以更改但如果设置为高值会对性能产生影响吗?

理想情况下,我想要一种用title的文本结果替换bodylinktranslation_pivot列,或者至少获取文本内容的方法每个作为一个单独的列。这可能在一个查询中吗?

我的另一种选择是将关键值对作为数组从translation_pivot中以id作为键检索,然后在查询文章后进行查找。这只是一个额外的查询,可能更简单。

哪种解决方案最适合?或者还有其他我想念的东西?

2 个答案:

答案 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`