RunOneSelect( queryBuilder: SQLQueryBuilderWrapper::SELECT_ONE( table: 'TuneVariants', id: $targetTuneVariantID ) ->cols([ 'T.ID AS TuneVariantID', 'T.TuneID AS TuneID', "CONCAT('[', GROUP_CONCAT( CONCAT( '{\"TimeSignature\":', JSON_QUOTE(T_TVP.TimeSignature), ',', '\"KeySignature\":', JSON_QUOTE(T_TVP.KeySignature), ',', '\"ABCNotation\":', JSON_QUOTE(T_TVP.ABCNotation), '}' ) ), ']') AS Parts" ]) ->join( join: 'INNER', spec: 'TuneVariantParts AS T_TVP', cond: 'T.ID = T_TVP.TuneVariantID' ) ->groupBy(spec: [ 'T.ID', ]) ); $tuneDetails = $db->RunOneSelect( queryBuilder: SQLQueryBuilderWrapper::SELECT_ONE( table: 'Tunes', id: $variantDetails['TuneID'] ) ); $tuneDetails = new DatabaseFolkTuneDetails($tuneDetails); $variantDetails = new TuneVariant($tuneDetails, $variantDetails); header(header: "Content-type: text/text"); echo $variantDetails->Build(); die();