0

INMySQL を使用して、セッション変数が句でどのように機能するかを知りたいです。

私はこれを自分で試しましたが、真剣に成功しませんでした。

セッション変数を使用したクエリ

SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1);
// result 88,89
SELECT @concat_var;
SELECT player_id FROM tableA WHERE player_id IN (@concat_var);

クエリ出力 (不正確)

player_id 
88

(結果必須)

player_id 
88 
89   
4

3 に答える 3

2

FIND_IN_SET()この質問の答えです

SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1);
SELECT @concat_var;
SELECT player_id FROM tableA WHERE FIND_IN_SET(player_id,@concat_var);
于 2012-06-11T17:43:17.880 に答える
0

@concat_var文字列が含まれます'88,89'。したがって:

SELECT player_id FROM tableA WHERE player_id IN (@concat_var);

実行中:

SELECT player_id FROM tableA WHERE player_id IN ('88,89');

player_idは整数型であるため、MySQLは文字列を浮動小数点数として比較することでクエリを実行します player_id

SELECT player_id FROM tableA WHERE player_id IN (88.0);

したがって、これが、報告した誤った結果が表示される理由です。

代わりに、結合を使用する必要があります。

SELECT player_id FROM tableA JOIN tableB USING (player_id) WHERE tableB.id = 1;
于 2012-06-11T10:29:15.177 に答える
0

私の知る限り、それは不可能です(編集:MySQL独自の拡張機能を使用していますが、@QueryMasterは実際に可能であることを示すことができました)@concat_var。単一の文字列であるため、最後のクエリは実際には(MySQL は文字列の整数プレフィックスを解析することにより、数値コンテキストにSELECT player_id FROM tableA WHERE player_id IN ('88,89')強制的にキャストするため、 ) と同等です。'88,89'88

ただし、次のことを実行できる必要があります。

SELECT player_id
FROM tableA
WHERE player_id IN (
    SELECT player_id
    FROM tableB
    WHERE id = 1
)

または、ほぼ同等です (サブクエリを含まないため、パフォーマンスが向上する可能性があります)。

SELECT player_id
FROM tableA
JOIN tableB USING (player_id)
WHERE tableB.id = 1
于 2012-06-11T10:27:11.370 に答える