查询中的错误 (1054):“where 子句”中的未知列“TableValue”

Posted

技术标签:

【中文标题】查询中的错误 (1054):“where 子句”中的未知列“TableValue”【英文标题】:Error in query (1054): Unknown column 'TableValue' in 'where clause' 【发布时间】:2015-07-05 02:18:55 【问题描述】:

跟进SELECTing the contents of the Table, which is a result of another value,我想在生成的字段上保留一个条件。如果我执行这个查询:

SELECT *, (
    SELECT `TableName` FROM `TableNames` WHERE `TableID`=`IndexType`
) AS `IndexTypeName`, 
CASE WHEN `IndexType`=1 THEN (
        SELECT `Username` FROM `Users` WHERE `IndexRowID`=`UserID`
   ) WHEN `IndexType`=2 THEN (
        SELECT `MessageContent` FROM `Messages` WHERE `IndexRowID`=`MessageID`
   ) WHEN `IndexType`=3 THEN (
        SELECT `CommentContent` FROM `Comments` WHERE `IndexRowID`=`CommentID`
   )
END `TableValue`
FROM `Index`
ORDER BY `IndexTime` DESC;

我显然会得到:

+---------+-----------+------------+---------------------+------------+---------------------+
| IndexID | IndexType | IndexRowID | IndexTime           | IndexTable | TableValue          |
+---------+-----------+------------+---------------------+------------+---------------------+
| 5       | 2         | 2          | 2015-04-10 11:45:00 | Messages   | Hello, Mr. Prave... |
+---------+-----------+------------+---------------------+------------+---------------------+
| 4       | 3         | 1          | 2015-04-10 11:30:00 | Comments   | @You, you aren't... |
+---------+-----------+------------+---------------------+------------+---------------------+
| 3       | 2         | 1          | 2015-04-10 11:25:00 | Messages   | Thanks for your ... |
+---------+-----------+------------+---------------------+------------+---------------------+
| 2       | 1         | 2          | 2015-04-10 10:55:00 | Users      | Jeff Atwood         |
+---------+-----------+------------+---------------------+------------+---------------------+
| 1       | 1         | 1          | 2015-04-10 10:50:00 | Users      | Praveen Kumar       |
+---------+-----------+------------+---------------------+------------+---------------------+

但是,如果我想过滤 TableValue 的值,那么如果我给出如下查询:

SELECT *, (
    SELECT `TableName` FROM `TableNames` WHERE `TableID`=`IndexType`
) AS `IndexTypeName`, 
CASE WHEN `IndexType`=1 THEN (
        SELECT `Username` FROM `Users` WHERE `IndexRowID`=`UserID`
   ) WHEN `IndexType`=2 THEN (
        SELECT `MessageContent` FROM `Messages` WHERE `IndexRowID`=`MessageID`
   ) WHEN `IndexType`=3 THEN (
        SELECT `CommentContent` FROM `Comments` WHERE `IndexRowID`=`CommentID`
   )
END `TableValue`
FROM `Index`
WHERE `TableValue` LIKE '%prav%'
ORDER BY `IndexTime` DESC;

我收到以下错误:

我不想对子 SELECT 查询中的每个案例都使用过滤器。 执行以下操作是否还有其他方法:

在每个 Sub-SELECT 语句中使用 WHERE。 为整个事物创建一个视图。

提前致谢。

【问题讨论】:

mysql 中的 where 子句中使用列别名是非法的。请参考:***.com/questions/200200/… ***.com/questions/942571/…的可能重复 【参考方案1】:

您不能在where clause 中使用别名 您需要使用subqueryhaving clause

SELECT *, (
    SELECT `TableName` FROM `TableNames` WHERE `TableID`=`IndexType`
) AS `IndexTypeName`, 
CASE WHEN `IndexType`=1 THEN (
        SELECT `Username` FROM `Users` WHERE `IndexRowID`=`UserID`
   ) WHEN `IndexType`=2 THEN (
        SELECT `MessageContent` FROM `Messages` WHERE `IndexRowID`=`MessageID`
   ) WHEN `IndexType`=3 THEN (
        SELECT `CommentContent` FROM `Comments` WHERE `IndexRowID`=`CommentID`
   )
END `TableValue`
FROM `Index`
having `TableValue` LIKE '%prav%'
ORDER BY `IndexTime` DESC;

select * from(
    SELECT *, (
        SELECT `TableName` FROM `TableNames` WHERE `TableID`=`IndexType`
    ) AS `IndexTypeName`, 
    CASE WHEN `IndexType`=1 THEN (
        SELECT `Username` FROM `Users` WHERE `IndexRowID`=`UserID`
       ) WHEN `IndexType`=2 THEN (
        SELECT `MessageContent` FROM `Messages` WHERE `IndexRowID`=`MessageID`
       ) WHEN `IndexType`=3 THEN (
        SELECT `CommentContent` FROM `Comments` WHERE `IndexRowID`=`CommentID`
       )
    END `TableValue`
    FROM `Index`
)x
where `TableValue` LIKE '%prav%'
ORDER BY `IndexTime` DESC;

【讨论】:

哇!就这么简单吗?谢谢!【参考方案2】:

您可以使用HAVING 子句来使用别名。

试试这个

SELECT *, (
    SELECT `TableName` FROM `TableNames` WHERE `TableID`=`IndexType`
) AS `IndexTypeName`, 
CASE WHEN `IndexType`=1 THEN (
        SELECT `Username` FROM `Users` WHERE `IndexRowID`=`UserID`
   ) WHEN `IndexType`=2 THEN (
        SELECT `MessageContent` FROM `Messages` WHERE `IndexRowID`=`MessageID`
   ) WHEN `IndexType`=3 THEN (
        SELECT `CommentContent` FROM `Comments` WHERE `IndexRowID`=`CommentID`
   )
END `TableValue`
FROM `Index`
HAVING `TableValue` LIKE '%prav%'
ORDER BY `IndexTime` DESC;

【讨论】:

哇!就这么简单吗?谢谢!【参考方案3】:

您可以在 SQL 中使用 with 子句,您可以在其中对查询的输出应用过滤器。 它被称为在 SQL 中使用 with 的通用类型表达式。这样更有效率。

【讨论】:

嗨,达。你能解释更多吗?你能用它显示一个查询吗?

以上是关于查询中的错误 (1054):“where 子句”中的未知列“TableValue”的主要内容,如果未能解决你的问题,请参考以下文章

错误代码:1054 'where 子句'中的未知列'billId'

#1054 - MySQL 中“where 子句”中的未知列“proximite”

SQLSTATE [42S22]:找不到列:1054 'where 子句为啥'中的未知列'4'我找不到错误

未找到列:1054“where 子句”中的未知列“MONTH(date)”[重复]

在 MySQL 查询的 WHERE 子句中使用列别名会产生错误

SQLSTATE [42S22]:找不到列:1054 'where 子句'中的未知列'user_id'