繁体   English   中英

变量表的MySql内部/左联接

[英]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'

photosposts表格设置很可能是不同的,因此您无法将它们放在单个结果集中。

使用标准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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM