【问题标题】:Group concat Values separate with other rows as a name in sql query分组连接值与其他行分开作为sql查询中的名称
【发布时间】:2017-08-27 04:41:51
【问题描述】:
 SELECT GROUP_CONCAT(`flim_category_name` SEPARATOR '*') 
`flim_category_name`,country, GROUP_CONCAT(`flim_video` SEPARATOR '*') flim_video,
  GROUP_CONCAT(`flim_video_images` SEPARATOR '*') flim_video_images FROM 
  flim_management_table GROUP BY `country` limit 0,1

在这个查询中,我得到了这样的表结构

flim_category_name    country     flim_video                                       flim_video_images
Guru*Mersal*Aadi      India    ww.com,ww.com,ww.com* ww.com,ww.com,ww.com* ,,,     217953157.jpg,,,,,,,,,*,,,,,,,,,

我需要用 start 来分隔,而不是像这样的单独行

flim1 flim2   flim3    country     flim_video1             flim_video2        flim_video3   images1        image2     image 3
Guru  Mersal   Aadi      India    ww.com,ww.com,ww.com  ww.com,ww.com,ww.com       ,,,    217953157.jpg,,,  ,,,,,     ,,,,,

我需要像这样构造表格。

【问题讨论】:

  • 到目前为止你尝试了什么..?
  • Mysql 和 Oracle 数据库不同..您使用的是哪一个..?
  • 对此没有答案。我们怎么知道您所说的“连接列”是什么意思?什么栏目?
  • 你可以通过 mysql 的 group_concat 实现接近你的结果
  • normalise the db,这是个糟糕的结构

标签: php mysql sql


【解决方案1】:

在 Oracle 中,我能想到的最好的就是这个。

 WITH f AS
(
       SELECT 'Ghajini'             film_category_name ,
              'INDIA'               country ,
              'IMG1.jpg,iMAGE2.JPG' flim_images,
              'WW.COM,WW.COM,WW.COM' flim_url 
       FROM   dual
       UNION ALL
       SELECT 'dIWALE'              film_category_name ,
              'INDIA'               country ,
              'IMG1.jpg,iMAGE2.JPG' flim_images,
              'WW.COM,WW.COM'       flim_url
       FROM   dual
       UNION ALL
       SELECT 'gURU'                film_category_name ,
              'SOUTH AFRICA'        country,
              'IMG1.jpg,iMAGE2.JPG' flim_images,
              'WW.COM,WW.COM'       flim_url
       FROM   dual ), f2 AS
(
         SELECT   f.* ,
                  Row_number() over (PARTITION BY country ORDER BY ROWNUM ) rn
         FROM     f ), f3 AS
(
         SELECT   Listagg(film_category_name,',') within GROUP ( ORDER BY ROWNUM ) over ( PARTITION BY country ) film_category_name ,
                  country ,
                  flim_images,
                  flim_url,
                  rn
         FROM     f2 )
SELECT *
FROM   f3 pivot ( max(flim_images) AS flim_images_row  ,
                  max(flim_url)    AS flim_url FOR rn IN (1,2) ) p
ORDER BY film_category_name;

输出是这样的:

FILM_CATEGORY_NAME    COUNTRY           1_FLIM_IMAGES_ROW    1_FLIM_URL             2_FLIM_IMAGES_ROW   2_FLIM_URL
Ghajini,dIWALE         INDIA            IMG1.jpg,iMAGE2.JPG  WW.COM,WW.COM,WW.COM   IMG1.jpg,iMAGE2.JPG WW.COM,WW.COM
gURU                   SOUTH AFRICA     IMG1.jpg,iMAGE2.JPG  WW.COM,WW.COM   - 

如果您不知道每个 country 的行数,那么您唯一的选择是使用动态 SQL 动态生成和执行查询。但是我不推荐它,因为您的结构和设计表对于任何数据提取都是低效的。您需要重新构建组件并在需要存储和检索有用数据的地方创建单独的表。

【讨论】:

    【解决方案2】:

    可以使用Mysql的group_concat函数:

    select group_concat(Film_category_name), Country, group_concat(flim_images),group_concat(flim_url) from table group by country 

    对于 oracle,请检查以下内容:
    Is there any function in oracle similar to group_concat in mysql?

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2018-09-01
      • 2021-10-03
      • 2017-11-21
      • 2019-12-08
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      相关资源
      最近更新 更多