2013-04-07 764 views
5

我知道union查询必须有相同数量的列。我试图从表comments得到结果,并从表strings得到结果,该结果有多个连接。我如何正确?我还没有测试,因为我知道我会得到一个列数不同的错误。这是我试图结合的两个查询。mysql union不同列数

查询1(串)

SELECT sub.actionid as usersub, 
       ftable.`last-time` as lastvisited, updatetable.recent as mostrecent, parent.* FROM `strings` as parent 
     LEFT JOIN subscribe sub on sub.actionid=parent.id AND sub.userid=:userid 
     JOIN followers ftable on ((ftable.sid=parent.sid AND ftable.page='1') OR 
     (ftable.sid=parent.sid AND ftable.position=parent.position AND ftable.page='0') 
     OR (ftable.profile=parent.starter AND parent.guideline='1')) AND ftable.userid=:userid 
     JOIN `update-recent` updatetable on 
     ((updatetable.sid=parent.sid AND updatetable.position=parent.position AND updatetable.pageid='0') 
     OR (updatetable.profile=parent.starter) OR (updatetable.pageid=parent.pageid AND parent.pageid!=0)) 
     WHERE ftable.userid=:userid AND parent.deleted='0' GROUP BY parent.id 

查询2(评论)

SELECT * FROM comments WHERE viewed='0' AND (`starter-id`=:userid OR respondid=:userid) 

我想通过时间戳列posted(最近)ORDER BY posted DESC

订购的结果我如何结合这些查询?

+0

查询中没有聚合函数,那么GROUP BY的含义是什么? – Strawberry 2013-04-07 20:08:45

+0

[联合两个不同列数的表]的可能重复(http://stackoverflow.com/questions/2309943/unioning-two-tables-with-different-number-of-columns) – hakre 2014-04-27 23:23:40

回答

17

您可能希望选择列为NULL以占用某些表中的空白空间。

表A:(ID,列1)

表B:(ID,列1,列2)

Select id, column1, null as column2 from tableA 
UNION 
Select id, column1, column2 from tableB 
1

将空列(null as columnName)添加到列数更少的查询中。在这种情况下,您应该避免使用*,以便更好地控制两个查询中列的顺序。

1

另一种非常狡猾的方式来解决这个问题是CONCAT_WS之间不共享列表格例如

SELECT `r_id`, `r_added`, CONCAT_WS('###',`otherfield1`,`otherfield2`) as r_other FROM table1 
UNION 
SELECT `r_id`, `r_added`, CONCAT_WS('###',`otherfield3`,`otherfield4`,`otherfield5`) as r_other FROM table2 

然后,您可以以编程方式重建该数据,例如,

$rother = explode("###", $row['r_other']); 

非常糟糕的方式来获得这个数据但可能会有人出来一个修复。你甚至可以改变分隔符,例如#t1##t2#搜索字符串以确定连接数据来自哪个表。