27

IN (..)次のように、プロシージャ本体のクエリの一部に引数を渡す必要があるストアド プロシージャを作成しています。

DELIMITER //

CREATE PROCEDURE `get_users_per_app` (id_list TEXT)
BEGIN
    SELECT app_id, GROUP_CONCAT(user_id) FROM app_users WHERE app_id IN (id_list) GROUP BY app_id;
END//

DELIMITER ;

id_listテキスト値を渡すと、整数として補間され、最初の ID のみが考慮され、IN()条件内で使用されるため、これは明らかに機能しません。

この特定のタイプのプロシージャは、代わりに含まれているクエリに置き換えることができることを認識していますが、私の質問はまだ残っていると思います-この種のデータを渡す必要がある場合はどうすればよいですか?

また、このクエリのアプローチはベスト プラクティスとは見なされない可能性があることも認識していますが、私の使用例では、ID-ID ペアのフラット リストを返すよりも実際には優れています。

4

1 に答える 1

46

FIND_IN_SET()MySQLを使用して ID のリストを使用できるはずです。

CREATE PROCEDURE `get_users_per_app` (id_list TEXT)
BEGIN
    SELECT
        app_id, GROUP_CONCAT(user_id)
    FROM
        app_users
    WHERE
        FIND_IN_SET(app_id, id_list) > 0
    GROUP BY app_id;
    ...
于 2012-08-21T23:18:43.463 に答える