MySQL列扁平化为字符串

时间:2017-10-04 14:35:10

标签: mysql sql

我试图避免传递两个单独的MySQL(版本5.6.37)查询,并使用事务。我认为这可以在一个查询中完成,但我需要知道我哪里出错了。

如果我使用此查询:

SELECT titles.t_id,title,cover,pageData.pageNum 
FROM titles 
    JOIN biblio     ON titles.t_id = biblio 
    JOIN pageData   ON biblio.t_id = pageData.t_id 
WHERE titles.t_id = '1';

它成功返回包含三列冗余数据的结果,并且只返回一列新数据(p_id):

t_id | title                |  cover    | pageNum
1    | The Art of the Deal  |  32.jpg   | 1
1    | The Art of the Deal  |  32.jpg   | 2
1    | The Art of the Deal  |  32.jpg   | 3
1    | The Art of the Deal  |  32.jpg   | 4
1    | The Art of the Deal  |  32.jpg   | 5

我认为有一种方法可以修改查询,以便将pageNum列中的新数据展平为单个结果(即从整数值转换为分隔字符串),如下所示:

t_id | title                |  cover    | p_id
1    | The Art of the Deal  |  32.jpg   | 1,2,3,4,5

我一直在SELECT中尝试使用子SELECT,但是我有一致的语法错误。 有没有办法将以下两个查询结合起来得到上述结果?

SELECT titles.t_id,title,cover 
FROM titles 
    JOIN biblio     ON titles.t_id = biblio 
WHERE titles.t_id = '1';

SELECT pageData.pageNum FROM pageData WHERE pageData.t_id = '1'

3 个答案:

答案 0 :(得分:3)

您可以将GROUP_CONCAT与GROUP BY结合使用。

SELECT
    titles.t_id
  , title,cover
  , GROUP_CONCAT(pageData.pageNum) AS p_id 
FROM titles 
    JOIN biblio     ON titles.t_id = biblio 
    JOIN pageData   ON biblio.t_id = pageData.t_id 
WHERE titles.t_id = '1'
GROUP BY
   t_id
 , title
 , cover

答案 1 :(得分:2)

使用GROUP_CONCAT功能。假设您的意思是JOIN biblio ON titles.t_id = biblio.t_id

SELECT t.t_id, title, cover, GROUP_CONCAT(pageData.pageNum) AS pageNum
FROM titles t
JOIN biblio b ON t.t_id = b.t_id 
JOIN pageData p ON b.t_id = p.t_id
WHERE t.t_id = '1'
GROUP BY t.t_id, title, cover

答案 2 :(得分:1)

使用MySQL函数GROUP_CONCAT()可以轻松完成所需的结果 为了生成有效的SQL查询并获得您期望的结果,您还需要向查询添加GROUP BY clause并将SELECT子句中出现的所有其他列放入其中:

SELECT titles.t_id, title, cover, GROUP_CONCAT(pageData.pageNum) AS p_id
FROM titles 
    JOIN biblio     ON titles.t_id = biblio 
    JOIN pageData   ON biblio.t_id = pageData.t_id 
WHERE titles.t_id = '1'
GROUP BY titles.t_id, title, cover