[英]How to skip NULL values from MySQL CONCAT and GROUP_CONCAT
[英]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.