【问题标题】:mySql Inner/left Join from Variable tables来自变量表的 mySql 内/左连接
【发布时间】:2014-06-20 18:40:31
【问题描述】:

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

}

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

【问题讨论】:

  • 当它们匹配时你消除了什么?

标签: php mysql left-join inner-join


【解决方案1】:

您可以使用UNION 关键字将两个结果的结果合并为一个,但这只有在它们共享相同结构时才有可能。

另外,从包含您的表名的变量中选择是有风险的业务,我强烈建议您出于安全目的更改它。

【讨论】:

  • 现在我正在使用这个: $query = " (SELECT identifier, date_created as dt from photos WHERE uid = '$uid') UNION (SELECT identifier , date_created as dt from posts WHERE uid = '$uid') ORDER BY dt DESC LIMIT $tpage,$limit ";
【解决方案2】:

您可以在多个结果集中获得结果:

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 的表设置不同,因此您无法将它们放在一个结果集中。

【讨论】:

    【解决方案3】:

    标准 SQL 无法实现。考虑一下:

    create table foo (bar text);
    insert into foo ('baz');
    select * from (select bar from foo)
    

    绝对有 NO 方法让您告诉数据库您实际上希望它使用您存储在 foo 表中的 baz 值作为表的名称做它的select *。相反,您实际上会得到:

    ERROR 1248 (42000): Every derived table must have its own alias
    

    因为select bar 查询的结果将用于临时表,而您将获取该临时表的所有记录,最终得到baz 的结果集,而不是从名为baz.

    您需要使用存储过程,动态构建您的查询,并在数据库中exec() 它。

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 2012-03-22
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多