我在查询中苦苦挣扎,我已经尝试了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样式源。其中一些操作与媒体(表格标题)相关,而其他操作与徽章(表格徽章)相关。我想获取最后的操作及其相关数据(问题是相关数据必须来自具有不同列的不同表)。
我该怎么做?
答案 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)
按重要性排序:
*
,而是从公用表格中选择*
,并专门从title
和badge
中选择列,以便从这些列中选择列数表格相同且类型相同where media_id is not null
到第一个查询,where badge_id is not null
到第二个查询。请注意,如果两个ID都存在,那么您将获得该项的两行join
关键字)