2012-11-25 33 views
0

我有这两个查询无法执行工会,得到#1248 - 每一个派生表必须有它自己的别名错误

select 
    t . *, events.event_time as last_time 
from 
    events, 
(
    (
     select 
      bonding.type, 
       bonding.global_id2 as target_post, 
       bonding.target_id as on_whose_post, 
       GROUP_CONCAT(bonding.shooter_id) as shooter_ids, 
       GROUP_CONCAT(bonding.what_global_id) as shooted_what, 
       MAX(bonding.what_global_id) as last, 
       'bonding' as flag 
     from 
      bonding 
     where 
      bonding.type = 1 
       and bonding.shooter_id in (select 
        `user2` 
       from 
        relation_table 
       where 
        `user1` = 192) 
     group by bonding.global_id2 
    ) 
    union 
    (
    select 
      bonding.type, 
       bonding.global_id2 as target_post, 
       bonding.target_id as on_whose_post, 
       GROUP_CONCAT(bonding.shooter_id) as shooter_ids, 
       GROUP_CONCAT(bonding.what_global_id) as shooted_what, 
       MAX(bonding.what_global_id) as last, 
       'bonding' as flag 
     from 
      bonding 
     where 
      bonding.type = 2 
       and bonding.shooter_id in (select 
        `user2` 
       from 
        relation_table 
       where 
        `user1` = 192) 
     group by bonding.global_id2 
    ) 
    union 
    (
    select 
      bonding.type, 
       bonding.global_id2 as target_post, 
       bonding.target_id as on_whose_post, 
       GROUP_CONCAT(bonding.shooter_id) as shooter_ids, 
       GROUP_CONCAT(bonding.what_global_id) as shooted_what, 
       MAX(bonding.what_global_id) as last, 
       'bonding' as flag 
     from 
      bonding 
     where 
      bonding.type = 5 
       and bonding.shooter_id in (select 
        `user2` 
       from 
        relation_table 
       where 
        `user1` = 192) 
     group by bonding.global_id2 
    ) 
    union 
    (
    select 
      bonding.type, 
       bonding.global_id2 as target_post, 
       bonding.target_id as on_whose_post, 
       GROUP_CONCAT(bonding.shooter_id) as shooter_ids, 
       GROUP_CONCAT(bonding.what_global_id) as shooted_what, 
       MAX(bonding.what_global_id) as last, 
       'bonding' as flag 
     from 
      bonding 
     where 
      bonding.type = 9 
       and bonding.shooter_id in (select 
        `user2` 
       from 
        relation_table 
       where 
        `user1` = 192) 
     group by bonding.global_id2 
    ) 
    union 
    (
    select 
      bonding.type, 
       bonding.global_id2 as target_post, 
       bonding.target_id as on_whose_post, 
       GROUP_CONCAT(bonding.shooter_id) as shooter_ids, 
       GROUP_CONCAT(bonding.what_global_id) as shooted_what, 
       MAX(bonding.what_global_id) as last, 
       'bonding' as flag 
     from 
      bonding 
     where 
      bonding.type = 10 
       and bonding.shooter_id in (select 
        `user2` 
       from 
        relation_table 
       where 
        `user1` = 192) 
     group by bonding.global_id2 
    ) 

)as t where events.global_id = t1.last 

等一个: -

SELECT 
    post_stream.type, 
    post_stream.ref_global_id as target_post, 
    post_stream.user_id as on_whose_post, 
    post_stream.user_id as shooter_ids, 
    post_stream.ref_global_id as shooted_what, 
    post_stream.ref_global_id as last, 
    'stream' as flag, 
    events.event_time as last_time 
FROM 
    post_stream, 
    events, 
    relation_table 
WHERE 
    events.global_id = post_stream.ref_global_id 
     and post_stream.type IN (2 , 3, 7, 8) 
     AND post_stream.user_id = relation_table.user2 
     AND relation_table.user1 = 192 

现在我需要执行两个查询的联合以获得组合结果,但它给出了 每个派生表都必须有它自己的别名错误,我应该为派生表放置一个别名,这两个查询在单独运行时运行时没有错误。

+0

它要求你在你的第一个查询(每个'UNION(SELECT ...)'语句,包括第一个'SELECT'中别名子查询,你也可以用完全相同的方式别名第二个查询 – dash

+0

我是一些如何能够解决问题,但这个查询需要40秒完成...... – manish

+0

您需要停止使用'FROM a,b,c WHERE ... AND ...'表示法并使用显式的'FROM a JOIN b ON ... JOIN c ON ...'表示法,你需要知道其他的存在,这样你就可以读取在90年代写入的查询,当JOIN的支持并不总是可用时,你绝不应该写它自己 –

回答

1

第一个查询的格式为长约116行,包含一个5向UNION子查询。这5个子查询似乎与WHERE子句中的一个值相同。这个重写将SQL简化为:

SELECT t.type, t.target_post, t.on_whose_post, t.shooter_ids, t.shooted_what, 
     t.last, t.flag, events.event_time AS last_time 
    FROM events JOIN 
     (SELECT bonding.type, 
       bonding.global_id2 AS target_post, 
       bonding.target_id AS on_whose_post, 
       GROUP_CONCAT(bonding.shooter_id) AS shooter_ids, 
       GROUP_CONCAT(bonding.what_global_id) AS shooted_what, 
       MAX(bonding.what_global_id) AS last, 
       'bonding' AS flag 
      FROM bonding 
     WHERE bonding.TYPE IN (1, 2, 5, 9, 10) 
      AND bonding.shooter_id IN (SELECT user2 FROM relation_table WHERE user1 = 192) 
     GROUP BY bonding.global_id2 
     ) AS t 
    ON events.global_id = t1.last 

这将更容易与第二个查询结合起来。随着进一步的修订,我可能会删除bonding.前缀,因为主子查询中唯一的表是bonding

SELECT p.type   AS type, 
     p.ref_global_id AS target_post, 
     p.user_id  AS on_whose_post, 
     p.user_id  AS shooter_ids, 
     p.ref_global_id AS shooted_what, 
     p.ref_global_id AS last, 
     'stream'  AS flag, 
     e.event_time AS last_time 
    FROM post_stream AS p 
    JOIN events   AS e ON e.global_id = p.ref_global_id 
    JOIN relation_table AS r ON p.user_id = r.user2 
WHERE r.user1 = 192 
    AND post_stream.type IN (2 , 3, 7, 8) 

问题:

第二个查询应使用JOIN符号也被改写

  1. 你肯定on_whose_postshooter_ids应该从同一列?
  2. 您确定shooted_whatlast应该来自同一列吗?

这样做可能是有效的(也不是太牵强)的原因 - 但这并不明显。

不幸的是,我们还没有被告知如何将第一个查询中的数据与第二个查询连接起来。似乎有很多相同的列,只有OP可以确定需要什么。

+0

使用IN(1,2,5,9,10)不会给我所需的结果,因为我想使用IN单独分组具有{bonding.type = 1,bonding.type = 2,bonding.type = 5}的数据将把所有东西组合在一起。 – manish

+0

我是MySQL的新手,只是出于好奇心,我问的是使用“join a on b”语句比使用“from a,b”更好,或者它们都是相同的 – manish

+0

这是无稽之谈。在type = 1的输出中将会有一行,对于type = 2等的输出将会有一行。您正在使用MySQL,它具有关于子查询中的非聚合值如何以准随机方式进行选择的规则,但我没有改变你的查询部分。小心查询中未列出GROUP BY子句中的非聚合列;它们是可移植性的责任,并且很可能是非确定性的。 –

相关问题