如何将此查询 returning 多条记录更改为 return 包含原始记录串联的单个记录?
How can I change this query returning multiples records to return a single record containing the concatenation of the original records?
我不是很喜欢数据库,我面临以下问题。我正在使用 MySql
我有这个查询:
SELECT
LSSN.livestock_species_name AS species_name,
LSFT.feed_type_name AS feed_type_name,
LSFT.description AS feed_description
FROM LivestockDetails AS LSD
INNER JOIN LivestockSpecies AS LSS
ON LSD.live_stock_species_id = LSS.id
INNER JOIN LivestockSpeciesName AS LSSN
ON LSS.id = LSSN.livestock_species_id
INNER JOIN Languages AS LNG
ON LSSN.language_id = LNG.id
INNER JOIN LsFeedDetails AS LSFD
ON LSD.ls_feed_details_id = LSFD.id
INNER JOIN LsFeedTypes AS LSFT
ON LSFD.ls_feed_types_id = LSFT.id
WHERE LSD.live_stock_species_id = 3
AND LSD.ls_area_id = 2
AND LSD.ls_action_type_id = 1
AND LSD.ls_message_id is null
AND LNG.id = 1
那 returns 这些记录:
species_name feed_type_name feed_description
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Local Cows Rangeland Grasses
Local Cows Crop residues Maize and sorghum Stover, rice, wheat, and sugar bean straw, parts of banana plants, wheat straw
Local Cows Improved grasses e.g. Napier grass
Local Cows Browsing and herbaceous legumes Browsing (largely during dry season) and herbaceous legumes (year round)
Local Cows Planted pastures Napier, etc...
Local Cows Assorted weeds Assorted weeds
好的,这些检索到的数据很好,但我必须以这样的方式修改此查询:
1) 它 returns 一条记录,包含由先前查询检索到的记录中包含的所有信息的串联。
2) 串联必须是这样的:
feed_type_name RECORD-1 + (feed_description RECORD-1) + ";" +feed_type_name RECORD-2 + (feed_description RECORD-2) + ";" + feed_type_name RECORD-3 + ";" + (feed_description RECORD-3) + ..............................
因此,使用之前检索到的数据作为示例,如下所示:
Rangeland (Grasses) ; Crop residues (Maize and sorghum Stover, rice, wheat, and sugar bean straw, parts of banana plants, wheat straw) ; Improved grasses (e.g. Napier grass) ; ............................................
我真的不知道如何修改我的原始查询以创建执行类似操作的查询。你能帮我做吗?
GROUP BY "species_name" 并使用 GROUP_CONCAT(feed_type_name SEPARATOR ', ') 函数。
https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
使用 GROUP_CONCAT
并使用 GROUP BY
按物种聚合:
SELECT
LSSN.livestock_species_name AS species_name,
GROUP_CONCAT(CONCAT(LSFT.feed_type_name, ' (', LSFT.description, ')') SEPARATOR ';') AS text
FROM LivestockDetails AS LSD
INNER JOIN LivestockSpecies AS LSS
ON LSD.live_stock_species_id = LSS.id
INNER JOIN LivestockSpeciesName AS LSSN
ON LSS.id = LSSN.livestock_species_id
INNER JOIN Languages AS LNG
ON LSSN.language_id = LNG.id
INNER JOIN LsFeedDetails AS LSFD
ON LSD.ls_feed_details_id = LSFD.id
INNER JOIN LsFeedTypes AS LSFT
ON LSFD.ls_feed_types_id = LSFT.id
WHERE
LSD.live_stock_species_id = 3
AND LSD.ls_area_id = 2
AND LSD.ls_action_type_id = 1
AND LSD.ls_message_id is null
AND LNG.id = 1
GROUP BY
LSSN.livestock_species_name;
可以按如下方式进行
SELECT feed_type_name +'('+feed_description +') ; ' as [text()] from
.....
.....
.....
FOR XML PATH('')
我不是很喜欢数据库,我面临以下问题。我正在使用 MySql
我有这个查询:
SELECT
LSSN.livestock_species_name AS species_name,
LSFT.feed_type_name AS feed_type_name,
LSFT.description AS feed_description
FROM LivestockDetails AS LSD
INNER JOIN LivestockSpecies AS LSS
ON LSD.live_stock_species_id = LSS.id
INNER JOIN LivestockSpeciesName AS LSSN
ON LSS.id = LSSN.livestock_species_id
INNER JOIN Languages AS LNG
ON LSSN.language_id = LNG.id
INNER JOIN LsFeedDetails AS LSFD
ON LSD.ls_feed_details_id = LSFD.id
INNER JOIN LsFeedTypes AS LSFT
ON LSFD.ls_feed_types_id = LSFT.id
WHERE LSD.live_stock_species_id = 3
AND LSD.ls_area_id = 2
AND LSD.ls_action_type_id = 1
AND LSD.ls_message_id is null
AND LNG.id = 1
那 returns 这些记录:
species_name feed_type_name feed_description
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Local Cows Rangeland Grasses
Local Cows Crop residues Maize and sorghum Stover, rice, wheat, and sugar bean straw, parts of banana plants, wheat straw
Local Cows Improved grasses e.g. Napier grass
Local Cows Browsing and herbaceous legumes Browsing (largely during dry season) and herbaceous legumes (year round)
Local Cows Planted pastures Napier, etc...
Local Cows Assorted weeds Assorted weeds
好的,这些检索到的数据很好,但我必须以这样的方式修改此查询:
1) 它 returns 一条记录,包含由先前查询检索到的记录中包含的所有信息的串联。
2) 串联必须是这样的:
feed_type_name RECORD-1 + (feed_description RECORD-1) + ";" +feed_type_name RECORD-2 + (feed_description RECORD-2) + ";" + feed_type_name RECORD-3 + ";" + (feed_description RECORD-3) + ..............................
因此,使用之前检索到的数据作为示例,如下所示:
Rangeland (Grasses) ; Crop residues (Maize and sorghum Stover, rice, wheat, and sugar bean straw, parts of banana plants, wheat straw) ; Improved grasses (e.g. Napier grass) ; ............................................
我真的不知道如何修改我的原始查询以创建执行类似操作的查询。你能帮我做吗?
GROUP BY "species_name" 并使用 GROUP_CONCAT(feed_type_name SEPARATOR ', ') 函数。
https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
使用 GROUP_CONCAT
并使用 GROUP BY
按物种聚合:
SELECT
LSSN.livestock_species_name AS species_name,
GROUP_CONCAT(CONCAT(LSFT.feed_type_name, ' (', LSFT.description, ')') SEPARATOR ';') AS text
FROM LivestockDetails AS LSD
INNER JOIN LivestockSpecies AS LSS
ON LSD.live_stock_species_id = LSS.id
INNER JOIN LivestockSpeciesName AS LSSN
ON LSS.id = LSSN.livestock_species_id
INNER JOIN Languages AS LNG
ON LSSN.language_id = LNG.id
INNER JOIN LsFeedDetails AS LSFD
ON LSD.ls_feed_details_id = LSFD.id
INNER JOIN LsFeedTypes AS LSFT
ON LSFD.ls_feed_types_id = LSFT.id
WHERE
LSD.live_stock_species_id = 3
AND LSD.ls_area_id = 2
AND LSD.ls_action_type_id = 1
AND LSD.ls_message_id is null
AND LNG.id = 1
GROUP BY
LSSN.livestock_species_name;
可以按如下方式进行
SELECT feed_type_name +'('+feed_description +') ; ' as [text()] from
.....
.....
.....
FOR XML PATH('')