2013-01-14 140 views
1

我需要從兩個不同的表中的數據來創建歷史/存檔我的網站,像這樣的選擇數據:從兩個不同的表

  • 八月(6)
  • 九月( 4)
  • 十月(2)

我知道,有在計算器類似於這樣一個問題:PHP MYSQL Blog Archive Menu by Year and Month

但是,我有兩個相似但不同的表格。

我一直在使用這個例子嘗試:mysql select data from two tables and different structure,但我總是得到的錯誤「#1271 - 操作‘聯盟’排序規則的非法組合」

有沒有辦法,我可以組合得到任何其他方式我像上面的數據?

我的兩個表字段和結構:

1)新聞

  • ID(INT 5)
  • 標題(VARCHAR 200)
  • 內容(文本)
  • DATE_ADDED (日期時間)

2)設備

  • ID(INT 5)
  • 標題(VARCHAR 45)
  • 內容(VARCHAR 250)
  • DATE_ADDED(日期)

注:表身份證是自己的個人該文章的ID。我的桌子沒有任何共同之處。

回答

2

起初我以爲數據類型爲這個問題,你需要投的類型相匹配:

SELECT id, title, content, cast(date_added as Date) FROM NEWS 
UNION ALL 
SELECT id, title, cast(content as text), date_added FROM EQUIPMENT; 

然而,當我嘗試了一下我自己,我發現所有類型的隱式轉換。我再看看你的描述,並深入研究整理問題。我相信news表中的content列與Equipment表中的content列可能是不同的字符集和/或不同的排序規則類型。對於標題欄或整個表格,這可能是正確的。你需要嘗試轉換。我會建議這樣的:

SELECT 
    id, 
    convert(title using utf8) collate utf8_bin, 
    convert(content using utf8) collate utf8_bin, 
    date_added 
FROM 
    NEWS 
UNION ALL 

SELECT 
    id, 
    convert(title using utf8) collate utf8_bin, 
    convert(content using utf8) collate utf8_bin, 
    date_added 
FROM 
    EQUIPMENT; 

這應該可以解決您的問題。

+0

對於MS SQL,正確的語法是'CAST(表達式AS類型)'。 –

+0

嗨,我已經試過了代碼,但當我試圖作爲文本投射時出現錯誤。從我讀過的內容中,轉換或轉換隻允許BINARY [(N)],CHAR [(N)],DATE,DATETIME,DECIMAL [(M [,D])],SIGNED [INTEGER],TIME UNSIGNED [INTEGER] ? –

+0

@HamletHakobyan我誤讀了。將調整。 – Ilion

2

這是因爲你試圖聯合不同類型在一起,這是不可能的。列數和類型應匹配,以便您可以聯合他們的表。

date & datetime - 你認爲這些真的匹配嗎?

好吧,批評是足夠的:)現在的解決方案,我認爲你需要類似臨時表的東西,這樣你就可以1.查詢你的表之一,2.將類型轉換爲任何匹配你的其他表,3.insert進入臨時表。

現在您的臨時表匹配您的表。去和聯盟他們。

+0

感謝您爲什麼我不能'聯合'他們的解釋!兩張桌子是由兩個不同的人完成的,因此有所不同。 –

+0

@TessLaker不客氣。 –

+0

但是,如果您投射,則可以合併它們。 – Ilion