【问题标题】:MySQL query within if conditionif条件下的MySQL查询
【发布时间】:2013-10-11 15:31:25
【问题描述】:

我有以下表格:

用户:

id、用户名、所有者

管理员

id、用户名、所有者

交易:

id,sender_id,sender_type

每个用户都可以由管理员拥有 每个管理员都可以由另一个管理员拥有

我正在尝试处理某些访问级别,并且我想检索具有通过 PHP 生成的列表的发件人部分的所有者的查询行。

为此,我需要根据我拥有的数据获取发件人的所有者,而无需更改数据库结构:

SELECT 
    * ,
    IF (t.sender_type='admin',
        ( SELECT owner AS qowner 
          FROM admins
          WHERE id=t.sender_id),
          ( SELECT owner AS qowner FROM users 
            WHERE id=t.sender_id)
    ) AS qowner 
FROM `transactions` t 
WHERE qowner IN ('admin22','admin33','admin44','admin66')

我不断收到此错误:'where 子句'中的未知列'qowner'

我现在陷入了困境。 我将感谢所有的帮助。 谢谢!

【问题讨论】:

  • 您将qowner 别名用于不同的事情,这就是错误的原因
  • 我删除了别名并仅在 IF 查询后使用它,仍然是同样的问题。
  • 那是因为您试图在 where 子句中使用别名。在评估 WHERE 子句之前,别名实际上不存在 - stackoverflow.com/questions/200200/…

标签: mysql sql if-statement case conditional-statements


【解决方案1】:

我认为您似乎试图从 WHERE 子句中的子选择中引用一列。

但是不需要子选择:-

SELECT * ,
IF (t.sender_type='admin', a.owner, b.owner) AS qowner 
FROM transactions t 
LEFT OUTER JOIN admins a ON t.sender_id = a.id
LEFT OUTER JOIN users b ON t.sender_id = a.id
HAVING qowner IN ('admin22','admin33','admin44','admin66')

【讨论】:

  • 是的,我正在尝试引用子选择中的列。会试试这个,让你知道
  • 我使用了自己的查询,但我使用了 HAVING 而不是 WHERE,而且它有效!
【解决方案2】:
SELECT * ,
IF (t.sender_type='admin',(SELECT owner FROM admins WHERE id=t.sender_id),(SELECT owner FROM users WHERE id=t.sender_id)) AS qowner 
FROM transactions t 
WHERE qowner IN ('admin22','admin33','admin44','admin66')

(未经测试)

【讨论】:

  • 将查询修改为:"SELECT * ,IF (t.sender_type='admin',(SELECT owner FROM admins WHERE id=t.sender_id),(SELECT owner FROM users WHERE id=t .sender_id)) AS qowner FROM transactions t WHERE qowner IN ('admin22','admin33','admin44','admin66')" 我得到同样的错误。无论如何感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2016-02-07
  • 2018-12-24
相关资源
最近更新 更多