我有两张桌子。我试图为每个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
答案 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