mySql内部/左边从变量表加入

时间:2014-06-20 18:40:31

标签: php mysql left-join inner-join

我有一个名为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);

}

所以在这里我可以从其他表中获得结果,但如果可能的话,我想要一个查询而不是多个查询。

3 个答案:

答案 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'

最有可能的是,photosposts的表格设置不同,因此您无法在单个结果集中获取它们。

答案 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()