RunOneSelect( queryBuilder: SQLQueryBuilderWrapper::SELECT_ONE( table: 'Tunes', id: $targetTuneID ) ->cols(cols: [ 'T.*', ]) ); $variants = $db->RunOneSelect( queryBuilder: SQLQueryBuilderWrapper::SELECT( table: 'Tunes' ) ->cols([ 'T.ID AS TuneID', 'T_TV.ID AS TuneVariantID', 'T.Title', "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: 'TuneVariants T_TV', cond: 'T.ID = T_TV.TuneID' ) ->join( join: 'INNER', spec: 'TuneVariantParts T_TVP', cond: 'T_TV.ID = T_TVP.TuneVariantID' ) ->where(cond: 'T.ID = :__tune_id__') ->groupBy(spec: [ 'T.ID', 'T_TV.ID', 'T.Title', ]) ->bindValue(name: '__tune_id__', value: $targetTuneID) ); $tuneDetails = new DatabaseFolkTuneDetails($tuneDetails); $tuneDetails->Variants[] = new TuneVariant($tuneDetails, $variants); header(header: "Content-type: text/text"); echo $tuneDetails->Variants[0]->Build(); die();