用于mysql查询的左连接或联合?

时间:2014-11-30 14:35:49

标签: mysql sql

我在查询中苦苦挣扎,我已经尝试了UNION,但它需要相同数量的列结果,所以它没有用,这就是我尝试过的要做:

我试图从表格操作中选择最新的行:

 action_id INT  |  media_id INT |   badge_id INT  | performed_at TS
     ______________________________________________________________
        1       |        365    |     NULL        | timestamp
        2       |       NULL    |        26       | timestamp
        3       |       62      |       NULL      | timestamp

如果media_id不是NULL,我想从表标题中获取相应的行,如果badge_id不是NULL,我想从表徽章中获取相应的行。

所以我尝试了这个(但它没有用,因为标题和徽章没有相同数量的列):

 (SELECT * FROM actions, actions_type, a3m_account, title 
            WHERE actions.type_id = actions_type.type_id 
            AND actions.performed_by_user_id = a3m_account.id 
            AND actions.media_id = title.media_id)

            . ' UNION '

            (SELECT * FROM actions, actions_type, a3m_account, badges 
            WHERE actions.type_id = actions_type.type_id
            AND actions.performed_by_user_id = a3m_account.id 
            AND actions.badge_id = badges.badge_id) 


            . 'ORDER BY performed_at DESC '
            . 'LIMIT 10';

编辑: 我基本上创建了一个包含网站上所有操作的Twitter样式源。其中一些操作与媒体(表格标题)相关,而其他操作与徽章(表格徽章)相关。我想获取最后的操作及其相关数据(问题是相关数据必须来自具有不同列的不同表)。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

由于UNION仅适用于具有相同模式的表,因此您必须编写的查询具有以下结构(您尚未指定所需的字段):

 (SELECT <1st field list> 
 FROM actions, actions_type, a3m_account, title
 WHERE actions.type_id = actions_type.type_id 
 AND actions.performed_by_user_id = a3m_account.id 
 AND actions.media_id = title.media_id)

 UNION

 (SELECT <2nd fields list>
 FROM actions, actions_type, a3m_account
 WHERE actions.type_id = actions_type.type_id
 AND actions.performed_by_user_id = a3m_account.id 
 AND actions.badge_id = badges.badge_id) 

在&lt; 1st fields list&gt;中和&lt;第二个字段列表&gt;,在两个字段列表中必须具有相同数量的字段和相同类型。如果需要,您可以使用AS子句,以便在两个列表中都有相同的字段名称。

示例:

SELECT actions.action_id, actions.media_id AS additional_info
FROM ...
UNION 
SELECT actions.action_id, actions.badge_id AS additional_info
FROM ...

答案 1 :(得分:0)

按重要性排序:

  1. 不是从所有表格中选择*,而是从公用表格中选择*,并专门从titlebadge中选择列,以便从这些列中选择列数表格相同且类型相同
  2. where media_id is not null到第一个查询,where badge_id is not null到第二个查询。请注意,如果两个ID都存在,那么您将获得该项的两行
  3. 从您选择的声音中删除括号(因此它们不是内部查询,而只是一个查询的一部分
  4. 使用正确的连接语法(即使用join关键字)