MySQL group_concat从两个表返回值(包括NULL)

时间:2014-09-25 18:17:51

标签: mysql concat group-concat

我有两张桌子。我试图为每个article_steps行返回thumbnail_img和fullsize_img列各自的值。如果每个步骤都没有匹配的值,我希望这包括NULL。

CREATE TABLE IF NOT EXISTS `article_steps` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `article_id` int(10) NOT NULL,
  `step_num` int(3) NOT NULL,
  `step_title` char(100) NOT NULL,
  `step_body` text NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `step_body` (`step_body`,`step_title`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

CREATE TABLE IF NOT EXISTS `article_steps_gallery` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `article_id` int(5) NOT NULL,
  `step_num` int(5) NOT NULL,
  `thumbnail_img` text NOT NULL,
  `fullsize_img` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;

这是我的陈述:

SELECT a.id,a.step_num, a.step_title,a.step_body, CONCAT( (case when a.step_num=s.step_num then GROUP_CONCAT(fullsize_img, '|',thumbnail_img SEPARATOR '    ') end) ) AS images
FROM article_steps a, article_steps_gallery s 
WHERE a.article_id=s.article_id 
AND a.article_id=2
GROUP BY step_num

这是回归:

id  step_num    step_title  step_body   images  
5   1           faketitle1  fakebody1   NULL
6   2           faketitle2  fakebody2   image.jpg|image_thumbnail.jpg
7   3           faketitle3  fakebody3   NULL
8   4           faketitle4  fakebody4   NULL

唯一应返回NULL的step_num是#1 ---但它只能正确返回fullsize_img& thumbnail_img用于step_num 2.


SELECT a.step_num, a.step_title,a.step_body, GROUP_CONCAT(DISTINCT fullsize_img) AS image, GROUP_CONCAT(DISTINCT thumbnail_img) AS thumbnail
FROM article_steps a, article_steps_gallery s 
WHERE a.article_id=s.article_id 
AND a.step_num=s.step_num 
AND a.article_id=2
GROUP BY step_num

此语句返回正确的图像。但是,由于它是GROUP_CONCAT,它不会返回NULL值。因此,没有任何图像的step_num 1也不会被返回。

id  step_num    step_title  step_body   image       thumbnail
6   2           faketitle2  fakebody2   image2.jpg  image2_thumbnail.jpg
7   3           faketitle3  fakebody3   image3.jpg  image3_thumbnail.jpg
8   4           faketitle4  fakebody4   image4.jpg  image4_thumbnail.jpg

2 个答案:

答案 0 :(得分:1)

为什么你需要一个小组,你没有做任何聚合?

SELECT a.id,a.step_num, a.step_title,a.step_body, CONCAT( (case when a.step_num=s.step_num then GROUP_CONCAT(fullsize_img, '|',thumbnail_img SEPARATOR '    ') end) ) AS images
FROM article_steps a, article_steps_gallery s 
WHERE a.article_id=s.article_id 
AND a.article_id=2

mySQL Group上的PER DOCS:http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

服务器 可以自由选择 来自每个组的任何值,因此除非它们相同,否则所选的值是不确定的。

因此,您获取NULL的原因是由于您的group by而卷起的其中一条记录为null,而RDBMS是随机选择的那条记录。

如果你必须有一个组来消除重复......(为什么有重复?)

然后在每个字段中使用distinct或group:

SELECT DISTINCT a.id,a.step_num, a.step_title,a.step_body, CONCAT( (case when a.step_num=s.step_num then GROUP_CONCAT(fullsize_img, '|',thumbnail_img SEPARATOR '    ') end) ) AS images
    FROM article_steps a, article_steps_gallery s 
    WHERE a.article_id=s.article_id 
    AND a.article_id=2

SELECT a.id,a.step_num, a.step_title,a.step_body, CONCAT( (case when a.step_num=s.step_num then GROUP_CONCAT(fullsize_img, '|',thumbnail_img SEPARATOR '    ') end) ) AS images
FROM article_steps a, article_steps_gallery s 
WHERE a.article_id=s.article_id 
AND a.article_id=2
GROUP BY a.id,a.step_num, a.step_title,a.step_body, CONCAT( (case when a.step_num=s.step_num then GROUP_CONCAT(fullsize_img, '|',thumbnail_img SEPARATOR '    ') end) )

答案 1 :(得分:0)

我使用以下代码:

SELECT a.id,a.step_num, a.step_title,a.step_body,
(SELECT GROUP_CONCAT(fullsize_img) FROM article_steps_gallery s  WHERE a.step_num=s.step_num AND a.article_id=s.article_id) AS image,
(SELECT GROUP_CONCAT(thumbnail_img) FROM article_steps_gallery s  WHERE a.step_num=s.step_num AND a.article_id=s.article_id) AS thumbnail
FROM article_steps a
WHERE a.article_id=1