将字符串作为MySQL表名

3

查询本身已经解释说明了我卡住的地方,我无法更改架构,有没有办法使用从if语句获取的表名并继续查询?

SELECT *,IF(user.type = 1,"staff","admin") as "table" FROM user WHERE "table".user_id = user.id

http://sqlfiddle.com/#!9/842be4/1

我尝试设置一个变量,但仍然没有成功。你有什么想法吗? 谢谢。


你能发布一下管理员、用户和菜单的结构吗?它们之间的关系不是很明显。 - mseifert
抱歉,有一个小错别字,已经编辑了查询,现在应该可以理解了。谢谢。 - bro_php
不是真的。如果 user.type = 1,那么 table = user,并且你有 user.user_id = user.id。真的存在两个字段 user.user_iduser.id 吗? - mseifert
@mseifert,它在sqlfiddle上,应该会更容易。谢谢。 - bro_php
看一下我的帖子 - 我已经更新了它(这是一个“未删除”,所以不会显示为新帖子)。 - mseifert
2个回答

6
你想要一个动态查询,类似于:
SET @table_name = (SELECT IF(user.type = 1,"staff","admin") FROM `user`);

SET @t1 =CONCAT("SELECT * FROM menu LEFT JOIN ", @table_name," ON ", @table_name,".user_id = user.id");
 PREPARE stmt FROM @t1;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;

查询语句实际上有一个小变化,我刚刚编辑了一下。谢谢。 - bro_php
@bro_php,我也进行了编辑。如果有帮助,请查看答案中的编辑。 - Rahul
我在打字时实际上犯了一个错别字,你能检查一下最新的查询吗?再次感谢。 - bro_php
@bro_php,这并不是火箭科学。只需按照提供的答案进行更改即可。希望这有意义。 - Rahul
@bro_php,那是一个不同的问题,并且可能是因为你正在执行INNER JOIN而没有匹配的记录。将查询中的JOIN更改为LEFT JOIN并查看结果。请参见回答中的编辑查询。 - Rahul
显示剩余2条评论

1

我相信这将给你想要的东西。

SELECT * FROM user INNER JOIN staff on user.id = staff.user_id UNION

SELECT * FROM user INNER JOIN admin on user.id = admin.user_id

它返回,#1054 - 在'where clause'中未知的列'table.id' - bro_php

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接