如何实现一个sql查询,从一个返回多个记录的查询开始,返回一个包含多个列的记录?

tzcvj98z  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我不太喜欢数据库,我在使用mysql数据库时遇到了以下问题。
我有一张这样的table:

CREATE TABLE CommodityName (
  id                   BigInt(20) NOT NULL AUTO_INCREMENT,
  commodity_details_id BigInt(20) NOT NULL,
  language_id          BigInt(20) NOT NULL,
  commodity_name       VarChar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
  description          Text CHARACTER SET latin1 COLLATE latin1_swedish_ci, 
  PRIMARY KEY (
      id
  )
) ENGINE=InnoDB AUTO_INCREMENT=87 ROW_FORMAT=DYNAMIC DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
ALTER TABLE CommodityName COMMENT = '';

此表中的记录用不同的语言表示商品信息。
商品是由商品指定的,由商品详细信息id(即另一个表的fk)指定。
一个特定的商品可以有多个记录到这个commodityname表中(我有一个特定语言的每个翻译的记录,由language\u id字段表示)。例如,我有两个记录:

id                   commodity_details_id language_id          commodity_name          description                                                                                                                                                                                                                                                    
-------------------------------------------------------------------------------------------------------
1                    1                    1                    Rice Asia               Rice Asia                                                                                                                                                                                                                                                      
16                   1                    3                    Umuceli Asia            Umuceli Asia

表示相同的商品信息(两个都有商品详细信息\u id=1),但有两种语言(英语和基尼万达语)。理论上我也可以有其他语言,所以我可以有n个特定商品的记录。
我需要创建一个查询,其中对于指定的商品(其中商品详细信息id=1),它将检索到的记录的所有商品名称字段作为单个记录的列返回。
参考上一个例子:

commodity_details_id       commodity_name_EN      commodity_name_RWA          commodity_name_FR   
----------------------------------------------------------------------------------------------------------------
1                          Rice Asia              Umuceli Asia                null

如何实现这样一个查询,即从多个记录将每个记录中的一部分信息转换为新查询中的一个新列?

ds97pgxw

ds97pgxw1#

你要找的是所谓的动态轴心。
看看下面的代码,看看它是否适合你。在您的案例中,模式可能有点不同(只是列和表的名称)。我使用的是commodityname,commodity\u details,languages表。您只需在第2行的参数中传递商品详细信息id即可:

SET @sql = NULL;
SET @commodity_details_id = 1;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN language_id = ''',
      ID,
      ''' then ''',
      (select commodity_name from commodityname where language_id = L.Id and commodity_details_id = @commodity_details_id),
      ''' end) AS ',
      Concat('Commodity_Name','_', language_name)
    )
  ) INTO @sql
from languages L;

SET @sql = CONCAT(
'SELECT commodity_details_id, '
, @sql, 
' 
FROM CommodityName
where commodity_details_id = ',@commodity_details_id,'
group by commodity_details_id;
');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

您还可以用它创建一个存储例程,以便从应用程序或其他地方调用它。
请评论,如果它不适合你。

7tofc5zh

7tofc5zh2#

试试这个:

SELECT commodity_details_id,
MAX(CASE WHEN language_id=1 then commodity_name else null END) commodity_name_EN,
MAX(CASE WHEN language_id=3 then commodity_name else null END) commodity_name_RWA,
MAX(CASE WHEN language_id=2 then commodity_name else null END) commodity_name_FR
FROM CommodityName
group by commodity_details_id;

相关问题