私はここで奇妙なものがあります。MySQL CONCATは文字列を内部で切り捨てます。
私はかなり単純なストアドプロシージャで作業しています。 Webフォームに基づいてプロシージャに渡すことができるいくつかのパラメータがあります。それらの1つはソート順パラメータです。レコードはsong_title、artist、date_uploadedで並べ替えることができますが、最初に返されたレコードをsong_titleでソートする必要があります。これは、ユーザーがソートするためにsong_titleまたはアーティストを選択した場合はうまく動作しますが、ユーザーが 'date_uploaded'を選択した場合は爆発するようです。私は単純なIF ...を使用しているので、ソート順を評価してそれに応じて変更してください。
DROP PROCEDURE IF EXISTS spGetAllTracksSong;
DELIMITER //
CREATE PROCEDURE spGetAllTracksSong(IN startRecord INT, IN rowsReturned INT, IN searchArtist VARCHAR(255), IN searchTitle VARCHAR(244), IN orderBy VARCHAR(20), IN duets TINYINT(1))
BEGIN
select concat('song_title,',orderBy);
IF orderBy='date_uploaded' THEN SET orderBy='date_uploaded DESC';END IF;
select orderBy;
IF orderBy <> 'song_title'
THEN SET orderBy=CONCAT('song_title,',orderBy);
END IF;
select orderBy;
SET @outputSQL=CONCAT('SELECT song_title, artist, disc_number, is_duet, comments
FROM track
WHERE song_title LIKE CONCAT(\'%',searchTitle,'%\')
AND artist LIKE CONCAT(\'%',searchArtist,'%\')
AND is_bad=0
AND is_duet=',duets,'
ORDER BY ',orderBy ,'
LIMIT ',startRecord,',', rowsReturned);
PREPARE stmt FROM @outputSQL;
EXECUTE stmt;
END//
DELIMITER ;
だから、何が起こっているのか、私は「SONG_TITLE」とどんなORDERBYパラメータであるを連結しようとするとブロックで、それはそのパラメータの値を切り捨てることだ:
は、ここでは、コードです。だから date_uploaded DESC は になりますdate_uplo
これについてのご意見はありますか?私はかなり問題がIFブロックの中にあると確信しています。連結コードをテストした結果、私が望む結果が得られましたが、構文に間違いがあるかどうかわかりました。
'orderBy VARCHAR(20)'; 20はいくつかの "初期容量"ではなく、最大長です。 – Uueerdo
変数を20文字に制限しました。 –