1
+------------------+        +------------------+    
| object           |        | example          |
+------------------+        +------------------+    
| id               |        | id               |    
| table_name       |        | ...              |    
| ref_id           |        |                  |    
+------------------+        +------------------+    

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

いくつかの異なるテーブルから発生したオブジェクトのグループを表すことができるテーブルがあります。これらのオブジェクトはすべて、idによって参照される、を持っていobject.ref_idます。

object.table_nameによって(によって参照されるテーブルから)元のオブジェクトを選択しようとしていますobject.id。このために、私は次の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です。

TOMBOMのアプローチで更新

Tombomのソリューションを使用するとエラーが発生します。テストのために、CONCAT関数の変数を置き換えました。

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

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

#1243-EXECUTEに指定された不明なプリペアドステートメントハンドラー(stmt)

4

2 に答える 2

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;

更新:ストアドプロシージャを試してみてください:

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);
于 2013-03-11T11:19:39.857 に答える
1

最近、まったく同じ問題が発生しました。最後の行を削除すると、DEALLOCATE PREPARE stmt;すべてが機能し始めました。

于 2016-01-28T12:39:47.693 に答える