[英]mySql Inner/left Join from Variable tables
我有一个称为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);
}
因此,在这里我可以从其他表中获取结果,但是如果可能的话,我需要一个查询而不是多个查询。
您可以使用UNION
关键字将两个结果合并为一个,但这只有在它们共享相同结构的情况下才有可能。
另外,从包含表名的变量中进行SELECT是冒险的,我强烈建议您出于安全目的更改它。
您可以在几个结果集中获得结果:
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
表格设置很可能是不同的,因此您无法将它们放在单个结果集中。
使用标准SQL不可能。 考虑一下:
create table foo (bar text);
insert into foo ('baz');
select * from (select bar from foo)
绝对没有办法告诉数据库您实际上希望它使用存储在foo
表中的baz
值作为执行select *
的表的名称。 相反,您实际上会得到:
ERROR 1248 (42000): Every derived table must have its own alias
因为该select bar
查询的结果将被用作临时表,所以您将改为获取该临时表的所有记录,最后得到的结果是baz
,而不是从名为baz
的表中获取。
您需要使用存储过程,动态构建查询,然后在数据库中exec()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.