mysql - 不能在查询中使用 MySQL session 变量

标签 mysql

我有一个查询,我想在其中使用 session 变量,而不必一遍又一遍地输入数字以在 MySQL Workbench 中进行调试。

这是查询:

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 :

User variables are intended to provide data values. They cannot be used directly in an SQL statement as an identifier or as part of an identifier, such as in contexts where a table or database name is expected, or as a reserved word such as 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();

关于mysql - 不能在查询中使用 MySQL session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47031256/

相关文章:

mysql - 从多行中选择 DISTINCT,如果包含具有不需要值的行,则不要返回

php - ql-No Mysql 错误但数据库表未更新

php - 在 WHERE 子句中使用 mysql concat()?

php - 使用 PHP+MySQL 显示带有子类别和 n-sub 类别的类别

php - SQL - Insert INTO 没有任何结果

MySQL:从两个单独的ID列表查询并制作一个统一列表,没有重复值

mysql - 如何解决Mysql错误: Code: 1064

php - 无法通过 JS (Jquery) 发布,但可以通过表单发布

php - 具有多个 ands 和 ors 的 Mysql 查询

php - Doctrine Query Join 子查询语法