2010-02-23 59 views
2

我想構建一個選擇查詢,它將採取4個表中的所有列,然後命令並顯示結果由'名稱'列(在所有表中相同) 。我仍然在學習MySQL的知識。mysql選擇查詢幫助 - ORDER BY

我發現,因爲列共享名稱'名稱',只顯示最後一個表的結果。有沒有一種方法可以執行保留所有表中所有數據的查詢?

我應該使用不同的列名嗎?分享一個名字似乎更容易,因爲它們每個都是相同的信息。

SELECT * FROM table_one, table_two, table_three, table_four ORDER BY... 

的四個表沒有加入,而且結構是不同的。有些列名是共享(它看起來像我應該可以解決,我仍然可以在這一點),但每個人都有不同的量列。

謝謝!

+0

是這4代表具有相同的結構? – van 2010-02-23 17:14:09

+0

不,四個表未加入,結構不同... 某些列名是共享的(它看起來像我應該修復,我仍然可以在這一點上),但每個列都有不同的數量。 – 2010-02-23 17:19:29

+1

你是不正確的,在你的查詢表中加入;他們交叉連接。根據你寫的內容,這幾乎肯定不是你想要的。這也是爲什麼隱式連接是不好的做法,不應該使用。 – HLGEM 2010-02-23 18:32:21

回答

0

是的,你應該使用不同的列名,但得到的所有數據,你也可以寫quesries這樣的:

SELECT table_one.* t1, table_two.* t2, table_three.* t3, table_four.* t4 FROM table_one, table_two, table_three, table_four ORDER BY... 
3

如果有四張桌子之間沒有任何關係,使用UNION!而非:

SELECT a.name 
    FROM TABLE_ONE a 
UNION 
SELECT b.name 
    FROM TABLE_TWO b 
UNION 
SELECT c.name 
    FROM TABLE_THREE c 
UNION 
SELECT d.name 
    FROM TABLE_FOUR d 
ORDER BY name 

這裏有兩個選項 - UNION比較慢,因爲它會刪除重複項 - 最終的列表將是一個唯一的名稱列表。 UNION ALL更快,因爲它不會刪除重複項。

您可以通過表中的列以及使用:

SELECT a.*, 
     b.*, 
     c.*, 
     d.* 
    FROM (SELECT a.name 
      FROM TABLE_ONE a 
     UNION 
     SELECT b.name 
      FROM TABLE_TWO b 
     UNION 
     SELECT c.name 
      FROM TABLE_THREE c 
     UNION 
     SELECT d.name 
      FROM TABLE_FOUR d) x 
LEFT JOIN TABLE_ONE a ON a.name = x.name 
LEFT JOIN TABLE_TWO b ON b.name = x.name 
LEFT JOIN TABLE_THREE c ON c.name = x.name 
LEFT JOIN TABLE_FOUR d ON d.name = x.name 
+0

這工作完美,但只檢索名稱列。我試圖檢索所有列(或選定的列),所以我可以與名稱列一起回顯它們。換句話說,我想列表按名稱排序,但也有其他列(描述,start_time)出現以及... 我應該更清楚這一點...但這是優秀的! – 2010-02-23 18:35:17

+0

@johnny_n:已更新,但您將獲得大量空列,並且可能會有一些重複,具體取決於您擁有的數據量。 – 2010-02-23 18:52:18

+0

@OMG小馬 - 謝謝,我欣賞這個警告。也許更好的方法是隻查詢某些列......我相信我可以做到這一點。這裏有確定的學習曲線! ;-) – 2010-02-23 18:57:44

0

johnny_n,

您應該使用

SELECT name as name1, name as name2, name as name3 etc... 

顯然,你需要使用正確的語法,但使用AS關鍵字將允許您在查詢中使用所需的密鑰。

+0

你需要表別名,否則你會得到名稱衝突錯誤,因爲每個表中都有一個名稱列。 – 2010-02-23 17:15:50

0

如果他們都有着相同的name的....

SELECT * 
    FROM table_one 
LEFT JOIN 
    table_two USING(name) 
LEFT JOIN 
    table_three USING(name) 
LEFT JOIN 
    table_four USING(name) 
ORDER BY name