2013-03-11 64 views
1
+------------------+  +------------------+  
| object   |  | example   | 
+------------------+  +------------------+  
| id    |  | id    |  
| table_name  |  | ...    |  
| ref_id   |  |     |  
+------------------+  +------------------+  

object [ id = 5, table_name = example, ref_id = 2] 
example [ id = 2 ] 

我有一个表,它可以表示一组对象来源于许多不同的表。 这些对象都有一个id,引用object.ref_idSQL派生表结果未知列

我想从object.id中选择原始对象(来自object.table_name引用的表格)。为此,我试图使用下面的SQL查询。虽然这导致#1054 - Unknown column 'entity.id' in 'where clause'

SELECT * 
FROM (
     SELECT table_name 
     FROM object 
     WHERE id = 5) AS entity 
WHERE entity.id = (
     SELECT ref_id 
     FROM object 
     WHERE id = 5) 

我在做什么错?

事例

SELECT * 
FROM example 
WHERE id = (
    SELECT ref_id 
    FROM object 
    WHERE id = 5) 

虽然,对于我的情况下,FROM子句不是如实施例那样容易,因为该值通常从object.table_name的。 WITH TOMBOM的做法

使用从Tombom导致错误的溶液,用于测试的目的

UPDATE我已经取代在concat函数的变量。

SET @sql = CONCAT('SELECT * FROM ', 'example', ' WHERE id = ', '1'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

#1243 - Unknown prepared statement handler (stmt) given to EXECUTE

回答

2

你不能告诉MySQL的一个(子)查询的结果是一个表名这种方式。你必须用结果构建一个动态语句。

SELECT @tableName:=table_name, @refId:=ref_id FROM object WHERE id = 5 LIMIT 1; 

SET @sql = CONCAT('SELECT * FROM ', @tableName, ' WHERE id = ', @refId); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

UPDATE:请与存储过程的尝试:

DELIMITER $$ 
CREATE PROCEDURE procName(IN my_id INT) 
BEGIN 
SELECT @tableName:=table_name, @refId:=ref_id FROM object WHERE id = my_id LIMIT 1; 

SET @sql = CONCAT('SELECT * FROM ', @tableName, ' WHERE id = ', @refId); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END $$ 
DELIMITER ; 

然后用

CALL procName(5); 
+0

那么,有没有反馈?不是,你在找什么? – fancyPants 2013-03-11 12:33:42

+0

我遇到一些问题。将在这个问题中发布一个更新,因为在这个评论中它不会非常易读。 – Aquillo 2013-03-11 12:36:26

+0

虽然您的解决方案似乎根据MySQL文档有效。我不知道是什么导致我的错误。 – Aquillo 2013-03-11 12:40:30

1

我遇到一模一样的问题最近执行存储过程。当我删除最后一行DEALLOCATE PREPARE stmt;一切开始工作。