0

这是一个不符合我预期的问题。这是查询

SELECT  `table_name` 
FROM    `category` 
WHERE   `id` = ( SELECT `category_id` 
                 FROM    `assets` 
                 WHERE   `id` = '24028'  )

这是返回photos我需要用作表名的值,

在此处输入图像描述

从我需要检索最终值的地方。所以我这样使用它:

SELECT * 
FROM   ( 
         SELECT  `table_name` 
         FROM    `category` 
         WHERE   `id` =  ( SELECT `category_id` 
                           FROM   `assets` 
                           WHERE `id` = '24028'
                          )
       )

但这会返回错误

#1248 - 每个派生表都必须有自己的别名

所以,像这样使用它,

SELECT * 
FROM  (
        SELECT `table_name` 
        FROM   `category` 
        WHERE  `id` = (  SELECT `category_id` 
                         FROM   `assets` 
                         WHERE  `id` = '24028' )
       ) as `photos`

但它再次返回与上一张图像中相同的值。但我期望的是它应该返回以下值:

SELECT * FROM `photos`

其中照片是子查询返回的值。

4

2 回答 2

4

从外观上看,您正在尝试使用动态“FROM”表名构建查询。这样做的唯一方法是在代码中构建 SQL,或者使用准备好的语句:

DELIMITER //; 
SET @s := CONCAT('SELECT * FROM ', (SELECT  `table_name` FROM `category` WHERE `id` = (SELECT `category_id` FROM `assets` WHERE `id` = '24028'));

PREPARE stmt FROM @s;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;
//
于 2013-05-15T16:07:06.203 回答
0

然后根据您的评论答案,如果您只处理一个可能的“table_name”,为什么不直接加入它

select 
      A.ID,
      A.Category_ID,
      C.Category,
      TP.*
   from
      assets A
         JOIN Category C
            on A.ID = C.ID
         JOIN tbl_photo TP
            on A.ID = TP.ID
   where
      A.ID = '24028'
于 2013-05-15T18:11:02.863 回答