0

このクエリは 4 行を返す必要がありますが、ID が 62983 の 1 行を返します。理由はありますか?

SELECT *
    FROM sims_user_role_maps surm
    JOIN sims_role sr ON surm.role_id = sr.id
    WHERE 
        surm.user_id = 118730
        AND sr.organization_id REGEXP 62978|62981|62982|62983

SPコール

call schools_remove_for_user('f155ec0e-b9ce-11e1-a1fa-001cc4565d26', '62966|62969|62983') 

SP

CREATE PROCEDURE `schools_remove_for_user`(
    user_id NVARCHAR(255),
    school_ids LONGTEXT
)
BEGIN

DECLARE sims_user_id INT DEFAULT NULL;

SELECT u.sims_id 
INTO sims_user_id 
FROM user u 
WHERE u.id = user_id;

SET SQL_SAFE_UPDATES = 0;

DELETE FROM sims_user_role_maps
WHERE 
        user_id = sims_user_id
    AND role_id IN (
                SELECT role_id 
                FROM(
                    SELECT surm.role_id 
                    FROM sims_user_role_maps surm
                    JOIN sims_role sr ON surm.role_id = sr.id
                    WHERE 
                            surm.user_id = sims_user_id
                        AND sr.organization_id REGEXP school_ids) 
                A);

END
4

2 に答える 2

1

正規表現を引用符で囲んでいないため、ビット単位のOR|として機能し ます。

正しい構文はAND sr.organization_id REGEXP '62978|62981|62982|62983'です。sr.organization_id IN (x, y, z)特定の整数を一致させようとしているだけの場合は、どちらが優れているかを検討することもできます。

于 2012-07-16T18:54:33.863 に答える
0

その理由は、delete ステートメントの user_id でした。テーブル名をプレフィックスとして追加しました。

DELETE FROM sims_user_role_maps
WHERE 
        sims_user_role_maps.user_id = sims_user_id
    AND sims_user_role_maps.role_id IN (
于 2012-07-16T20:01:03.313 に答える