2016-02-05 112 views
1

我試圖加入或聯合兩個不同結構的表的結果,按照它們的公共pubdate列排序,但得到錯誤消息:MySQL JOIN/UNION從不同列數的兩個表中選擇所有行

「所使用的SELECT語句具有不同的列數」

$sql = " 
SELECT * FROM news WHERE published='1' AND image!='' AND featured='1' 
JOIN 
SELECT * FROM videos WHERE published='1' 
ORDER BY pubdate DESC 
"; 
$query = mysqli_query($connection, $sql); 
while($row = mysqli_fetch_array($query)){ 
$posttype = $row["posttype"]; 
$pubdate = $row["pubdate"]; 
if ($posttype == 'news'){ 
$content = $row["content"]; 
$image = $row["image"]; 
} // end if posttype 
if ($posttype == 'videos'){ 
$description = $row["description"]; 
} // end if posttype 
... 
echo .... 
} // end while 

如何編輯我的查詢,以便我能在獲取數組和事後檢索對應的行(該行是牽強,然後決定在兩個表共享的另一個共同行上)?

+2

你能告訴我們幾行樣本表數據,它的預期結果? – jarlh

+0

到目前爲止感謝您的幫助,我編輯了上面的代碼以提供更多關於我想要檢索的數據和輸出的詳細信息。 – rainerbrunotte

回答

0

既然你沒有提供的樣本數據,我們無法建議你正確的方法是什麼,以及如何使用,但我注意到:

隨着JOIN你有不正確的語法。應該是這樣的:

SELECT * 
FROM tbl1 t1 
INNER JOIN tbl2 t2 ON t1.Id = t2.Id 

如果你想使用UNION - 列和列應匹配兩個表中,所以你必須提供兩個表中列名,在下面的編號順序:

SELECT Col1, Col2, Coln 
FROM tbl1 

UNION 

SELECT Col1, Col2, Coln 
FROM tbl2 
+0

OP使用的表具有不同的列數。因此,上面顯示的UNION ALL只有在**從SELECT列表中刪除**列中的一列或多列時纔有效。這意味着您的UNION ALL的結果將比兩個原始表的**信息少**。另一種方法是**添加** NULL /文字/函數/無論你想表的列少。 – mauro

+0

你在開玩笑@mauro?我提供了語法,不是解決方案! OP想要使用'JOIN'的機會很高。如果我沒有注意到將NULL作爲列值添加,這並不意味着答案是不正確的,或者應該是downvoted。另外你爲什麼在談論'聯盟所有'也許OP想要使用'聯盟'來避免重複?爲什麼你沒有提供如何在'UNION ALL'運算符中使用'WHERE'子句的信息?我認爲,因爲你不需要提供所有的信息和教程爲什麼以及如何使用運營商等... –

0

您可以通過在選擇列表中添加缺少的列來爲具有不同列數的表格添加UNION ALL表格。我的意思是,假設你有:

SQL> create table one (c1 integer , c2 integer, c3 integer) ; 
SQL> create table two (c1 integer , c2 integer) ; 

以下UNION ALL將無法​​正常工作:

SQL> select * from one union all select * from two ; 
[mysqld-5.5.27]The used SELECT statements have a different number of columns 

但是這一次是確定:

SQL> select * from one union all select *, null from two ; 

注意我們沒有失蹤的加空(c3)列表two。你可以添加任何你想要的...

+0

最可怕的事情使用*與'UNION' ... –

+0

@StanislovasKalašnikovas我傾向於同意,但是個人喜好的問題。爲了簡潔起見,我做了它。我認爲OP得到了他正在尋找的答案... – mauro

+0

如果您的投票結果不滿,請留下評論原因。 –

相關問題