2013-04-07 14 views
5

私は、ユニオンクエリは同じ数の列を持つ必要があることを知っています。私はテーブルcommentsから結果を得ようとしており、テーブルstringsの結果は複数の結合を持っています。どのように私はこれを正しく行うのですか?私はまだテストしていません。なぜなら、異なる数の列でエラーが発生することがわかっているからです。ここに私が結合しようとしている2つのクエリがあります。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

+0

[列数の異なる2つのテーブルを結合する]の複製が可能です(http://stackoverflow.com/questions/2309943/unioning-two-tables-with-different-number-of-columns) – hakre

答えて

17

特定のテーブルの空き領域を吸収するために、列をNULLとして選択すると便利です。

表A:(ID、COLUMN1)

表B:(ID、COLUMN1、COLUMN2)

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#連結されたデータの元のテーブルを調べるために文字列を検索します。