2017-10-31 17 views
1

MySQL Workbenchでデバッグするためにセッション変数を何度も入力する必要がないという質問があります。クエリ内でMySQLセッション変数を使用できません

これはクエリです:

SET @userId = 2; 

SELECT 
    id, 
    reply_to, 
    from_id, 
    to_id, 
    message, 
    created_time, 
    is_viewed, 
    IF(from_id = @userId, to_id, from_id) AS partnerId, 
    IF(from_id = @userId, data->>'$.toUsername', data->>'$.fromUsername') AS partnerUsername, 
    IF(from_id = @userId, data->>'$.toImage', data->>'$.fromImage') AS partnerImage 
FROM message 
WHERE 
    (from_id = @userId OR to_id = @userId) AND 
    is_active = 1 
ORDER BY id DESC 
LIMIT 50; 

クエリが0の結果を返すこと。しかし、私がそれを変更した場合、

SELECT 
    id, 
    reply_to, 
    from_id, 
    to_id, 
    message, 
    created_time, 
    is_viewed, 
    IF(from_id = 2, to_id, from_id) AS partnerId, 
    IF(from_id = 2, data->>'$.toUsername', data->>'$.fromUsername') AS partnerUsername, 
    IF(from_id = 2, data->>'$.toImage', data->>'$.fromImage') AS partnerImage 
FROM message 
WHERE 
    (from_id = 2 OR to_id = 2) AND 
    is_active = 1 
ORDER BY id DESC 
LIMIT 50; 

すべてが期待どおりに動作します。どのように私はそれが動作すると期待どおりに動作しませんか? MySQLのdocsから

+0

try 'select user into @ userId' –

答えて

1

ユーザー変数は、データ値を提供することを意図しています。それらは、SQL文で識別子として、または識別子の一部として直接使用することはできません。たとえば、表またはデータベース名が必要なコンテキストやSELECTなどの予約語として使用できます。

したがって、変数はアプリケーションコードでのみ使用できます。 たとえば、PHP:

$query = "SELECT 
    id, 
    reply_to, 
    from_id, 
    to_id, 
    message, 
    created_time, 
    is_viewed, 
    IF(from_id = :userId, to_id, from_id) AS partnerId, 
    IF(from_id = :userId, data->>'$.toUsername', data->>'$.fromUsername') AS partnerUsername, 
    IF(from_id = :userId, data->>'$.toImage', data->>'$.fromImage') AS partnerImage 
FROM message 
WHERE 
    (from_id = :userId OR to_id = :userId) AND 
    is_active = 1 
ORDER BY id DESC 
LIMIT 50"; 
$stmt = $pdo->prepare($query); 
$stmt->execute([':userId' => 2]); 
$data = $stmt->fetchAll(); 
関連する問題