2013-03-11 75 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;一切開始工作。