我有一个名为activities
的表,在该表中我有这些有用的列(不提及所有列)
`item_id` AND `table`
几个不同的表,现在基本上这个activities
表的作用是指向不同表中的目标,比如说
SELECT * FROM `activities` WHERE `user_id` = 1;
你得到:
ID:1 TABLE:photos ITEM_ID:55
ID:2 TABLE:posts ITEM_ID:57
依旧......
我想从table
列的值中获取数据,此处我有一个photos
一个posts
这些是不同的表格。
我可以使用PHP循环来做到这一点:
$query = 'SELECT * FROM `activities` WHERE `user_id` = 1;'
$results = $DB->GetRows($query);
foreach($results as $result){
$table = $result->table;
$query2 = "SELECT * FROM `$table` WHERE `user_id` = '1'";
$res = $DB->GetRows($query2);
}
所以在这里我可以从其他表中获得结果,但如果可能的话,我想要一个查询而不是多个查询。
答案 0 :(得分:0)
您可以使用UNION
关键字将两个结果的结果合并为一个,但只有当它们共享相同的结构时才可以这样做。
此外,从包含您的表名的变量中选择SELECT是一项冒险的事情,我强烈建议您出于安全目的进行更改。
答案 1 :(得分:0)
您可以在多个结果集中获得结果:
SELECT photos.*
FROM activities
JOIN photos
ON photos.id = activities.item_id
WHERE activities.table = 'photos'
SELECT posts.*
FROM activities
JOIN posts
ON posts.id = activities.item_id
WHERE activities.table = 'posts'
最有可能的是,photos
和posts
的表格设置不同,因此您无法在单个结果集中获取它们。
答案 2 :(得分:0)
标准SQL无法实现。考虑一下:
create table foo (bar text);
insert into foo ('baz');
select * from (select bar from foo)
绝对有 NO 方式告诉数据库您确实希望它使用您在baz
表中存储的foo
值作为名称一个表来执行其select *
。相反,你实际上会得到:
ERROR 1248 (42000): Every derived table must have its own alias
因为select bar
查询的结果将被用作临时表,您将获取所有临时表的记录,最后得到baz
的结果集,而不是获取来自名为baz
的表。
您需要使用存储过程,动态构建查询,并在数据库中exec()
。