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

标签 mysql concatenation group-concat

我有两张 table 。我试图返回每个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 --- 但是它只能正确返回 step_num 2 的 fullsize_img 和thumbnail_img。

<小时/>
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

最佳答案

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

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 上的每个文档分组依据:http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

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

因此,您得到 NULL 的原因是,由于您的分组依据而汇总的记录之一为空,并且 RDBMS 正在随机选择该记录。

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

然后使用不同的或按每个字段分组:

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) )

关于MySQL group_concat 从两个表返回值(包括 NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045419/

相关文章:

c++ - 连接字符串的意外行为

python - 如何在 Python 中连接两个矩阵?

PHP MySQL GROUP_CONCAT 限制

mysql - 子查询上的 GROUP_CONCAT 的奇怪结果

php查询无结果

php - 根据日期自动执行操作。 PHP/MySQL

mysql - 加载 CSV 时设置插入时间戳

function - 如何将一列中所有单元格的内容 append ".jpg"?

mysql - Hibernate 双向或两个单向关系

MYSQL GROUP_CONCAT 和 IN