2014-09-25 11 views
0

У меня есть две таблицы. Я пытаюсь вернуть значения thumbnail_img и fullsize_img соответствующим значениям для каждой строки article_steps. Я хочу, чтобы это включало NULL, если для каждого шага нет соответствующих значений.MySQL group_concat возвращает значения (включая 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 

Единственный step_num, который должен возвращаться NULL является # 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

Измените CONCAT на это, чтобы увидеть, если ваши данные установки, как вы думаете, это: 'CONCAT ((случай, когда a.step_num = s.step_num, тогда GROUP_CONCAT (coalesce (fullsize_img, 'Nope'), '|', coalesce (thumbnail_img, 'Nope') SEPARATOR '') end)) ' – xQbert

+0

почему вы соглашаетесь | наряду с разделителем пучка пространств? это похоже на действительно плохую идею. –

+0

xQbert - ваш оператор CONCAT возвращает тот же результат – Unum

ответ

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 

PER DOCS на MySQl Группы по: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

Сервера является свободно выбирать любого значения из каждой группы, так что, если они не совпадают, значение, выбранное неопределенно.

Итак, причина, по которой вы получаете NULL, состоит в том, что одна из записей, которые свертываются из-за вашей группы, равна нулю, а РСУБД выбирает это случайным образом.

, если вы должны иметь группу по для устранения дубликатов ... (почему там дубликаты?)

Тогда либо использовать отчетливый или группу по каждой области:

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

Это правильно возвращает значение для изображений. Статья 1, шаг 1 возвращает соответствующие изображения. Статья 2, шаг 1 возвращает NULL. Это верно. Однако он возвращает только первую строку, а не все соответствующие строки. Если бы это могло вернуть все строки, это было бы золотым. – Unum

+0

xQbert, благодарю вас за помощь. Я также не знал о моем неправильном использовании GROUP BY. Я буду использовать его правильно в будущем. – Unum

+0

Удалите группу или выделите ее, она вернет все строки – xQbert

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 
Смежные вопросы