簡體   English   中英

MySQL group_concat從兩個表返回值(包括NULL)

[英]MySQL group_concat returning values (including NULL) from two tables

我有兩張桌子。 我正在嘗試為每個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 Group上的PER DOCS, 網址為: 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) )

我將其與以下代碼一起使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM