我知道联合查询必须具有相同数量的列。我正在尝试从表comments
获取结果,并从表strings
获得结果,该表具有多个联接。我怎么这么正确?我还没有测试,因为我知道我会收到不同列数的错误。以下是我要尝试合并的两个查询。
查询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 :(得分:20)
您可能希望选择列NULL
来占用某些表格中的空白区域。
表A:(id,column1)
表B:(id,column1,column2)
Select id, column1, null as column2 from tableA
UNION
Select id, column1, column2 from tableB
答案 1 :(得分:1)
将空列(null as columnName
)添加到列数较少的查询中。在这种情况下,您应该避免使用*
,以便更好地控制两个查询中的列顺序。
答案 2 :(得分: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#搜索字符串以查找连接数据来自哪个表。