Мой выбор возвращает значения как это:
Это может объединить две линии в одну? Если это так, это возможно в php, или Tsql?
Что-то вроде:
Это мой выбор:
SELECT TRM_ID_TURMA
, TRM_HORA_INICIO
, TRM_HORA_FIM
, TRM_DIA
, TRM_VAGAS
, MGN_NOME
, PROF.USU_NOME AS PROFESSOR
, ALU_MATRICULA
, USU.USU_NOME NOMEALUNO
FROM [MGB].[dbo].[TB_TURMA]
INNER JOIN TB_USUARIO PROF ON PROF.USU_ID_USUARIO = TRM_ID_PROFESSOR
INNER JOIN TB_NIVEL_TURMA ON NTR_ID_NIVEL_TURMA = TRM_ID_NIVEL
INNER JOIN TB_MGB_NIVEL ON MGN_ID_MGB_NIVEL = NTR_ID_MGB_NIVEL
INNER JOIN TB_LOCAL ON LOC_ID_LOCAL = TRM_ID_LOCAL
LEFT JOIN TB_TURMA_ALUNO ON TAL_ID_TURMA = TRM_ID_TURMA
LEFT JOIN TB_ALUNO ON ALU_ID_ALUNO = TAL_ID_ALUNO
LEFT JOIN TB_USUARIO USU ON USU.USU_ID_USUARIO = ALU_ID_USUARIO
WHERE TRM_ID_ACADEMIA = 27
AND TRM_STATUS >= 0
AND (TAL_STATUS IS NULL OR TAL_STATUS >= 0)
ORDER BY TRM_HORA_INICIO, TRM_HORA_FIM, TRM_DIA, ALU_MATRICULA, NOMEALUNO
Перефразируя, я думаю, вы говорите: когда TRM_ID_TURMA одинаково, выберите одну строку и объедините (с запятыми) содержимое ALU_MATRICULA и NOMEALUNO.
Это правильно?
Если это так, я думаю, вам следует решить это в PHP, потому что это гораздо проще, чем в SQL (какой бы диалект вы ни использовали, для меня загадка, я вижу mysql, sql, oracle и tsql).
Предположим, вы выполнили свой запрос и сохранили свой результат в ассоциативном наборе результатов, массиве, а затем попробуйте что-то вроде этого:
$RS = ......your query that results in an array.......
/*
$RS looks like:
array(
[0] => array("TRM_ID_TURMA"=>48, "TRM_HORA_INICIO" => "10:00:00 000000", ..etc..),
[1] => array("TRM_ID_TURMA"=>49, "TRM_HORA_INICIO" => "10:00:00 000000", ..etc..)
[2] => etc etc
)
*/
$tmp = array();
foreach ($RS as $one){
// $tmp used TRM_ID_TURMA as key, and row as content
if (isset($tmp[$one["TRM_ID_TURMA"]])){
// TRM_ID_TURMA already used, add to the fields ALU_MATRICULA and NOMEALUNO.
$tmp[$one["TRM_ID_TURMA"]]["ALU_MATRICULA"] .= ", " . $one["ALU_MATRICULA"];
$tmp[$one["TRM_ID_TURMA"]]["NOMEALUNO"] .= ", " . $one["NOMEALUNO"];
} else {
$tmp[$one["TRM_ID_TURMA"]] = $one;
}
}
И ваш желаемый результат теперь находится в $ tmp (с ключами TRM_ID_TURMA)
В MySQL, посмотрите на GROUP_CONCAT функция.
SELECT TRM_ID_TURMA, GROUP_CONCAT(USU.USU_NOME NOMEALUNO)
FROM [MGB].[dbo].[TB_TURMA]
GROUP BY TRM_ID_TURMA
Быть осведомленным group_concat_max_len, так как ваш результат будет усечен, если он превышает эту длину.
Пожалуйста, прочитайте ЭТА СТАТЬЯ
Он показывает, как объединить значения полей с «FOR XML», этот код взят из этой статьи:
USE AdventureWorks2008R2
SELECT CAT.Name AS [Category],
STUFF(( SELECT ',' + SUB.Name AS [text()]
— Add a comma (,) before each value
FROM Production.ProductSubcategory SUB
WHERE
SUB.ProductCategoryID = CAT.ProductCategoryID
FOR XML PATH('') — Select it as XML
), 1, 1, '' )
— This is done to remove the first character (,)
— from the result
AS [Sub Categories]
FROM Production.ProductCategory CAT