2012-09-09 83 views
0

原諒我,如果這似乎是常識,因爲我仍然在學習如何在多個表格之間拆分數據。學習SQL:UNION還是JOIN?

基本上,我有兩個:

  • general與領域userID,owner,server,name
  • count與領域userID,posts,topics

我不想從他們那裏獲取數據並不能決定我該怎麼做:在一個聯盟:

SELECT `userID`, `owner`, `server`, `name` 
FROM `english`.`general` 
WHERE `userID` = 54 LIMIT 1 
UNION 
SELECT `posts`, `topics` 
FROM `english`.`count` 
WHERE `userID` = 54 LIMIT 1 

或連接:

SELECT `general`.`userID`, `general`.`owner`, `general`.`server`, 
     `general`.`name`, `count`.`posts`, `count`.`topics` 
FROM `english`.`general` 
JOIN `english`.`count` ON 
    `general`.`userID`=`count`.`userID` AND `general`.`userID`=54 
LIMIT 1 

你認爲這將是更有效的方式,爲什麼?或者,也許兩者都太雜亂,開始?

+1

聯合示例是否實際工作???聯合通常需要每次選擇相同數量的字段和數據類型。你應該在這裏閱讀工會:http://dev.mysql.com/doc/refman/5.0/en/union.html。無論如何,我懷疑你想要加入。 – goatshepard

+2

在這裏你的小技巧。如果你的問題只是一個SQL查詢,那麼就不需要包含周圍的PHP,因爲這與問題無關,並且使得SQL很難閱讀。只需發佈你的SQL。乾杯。 – Kev

+0

謝謝,沒有想過。 :) –

回答

2

這不是關於效率,而是關於它們的工作原理。

UNION剛剛結合2個不同獨立查詢。所以你會一個接一個地得到2個結果集。

JOIN將一個結果集的每行附加到另一個結果集的每一行。因此,在總體結果集中,您有「長」行(按列數)

+0

感謝您的回覆,我一直無法分辨兩者之間的差異。 :) –

+1

JOIN不只是附加數據;它將第一組中的某些行匹配到另一組中的某些行 - 取決於您是使用內連接還是外連接等。 – Bryan

+0

@Bryan:好的,我已經解釋了一般機制。 'UNION'也不只是聯合2個結果集,是嗎?我做了一個一般的解釋,根據具體情況OP可以閱讀文檔或提出另一個問題 – zerkms

0

您想使用JOIN。連接用於創建一個相關數據組合的單個集合。你的聯合例子沒有意義(可能不會運行)。 UNION用於將兩個結果集鏈接到相同的列以創建具有組合行的集合(它不會「聯合」列)。

0

如果您想獲取用戶以及用戶帖子和主題。你需要使用JOIN這樣寫查詢:

SELECT general.*,count.posts,count.topics FROM general LEFT JOIN count ON general.userID=count.userID 
+0

這將取得所有用戶的數據,而不是唯一的數據,因爲技術上這兩個表都將填充'userID = 1,2, 3 ...' –

1

只是爲了完整性,因爲我不認爲這是其他地方提到:經常UNION ALL是什麼意圖,當人們使用UNION。

UNION將刪除重複項(因此它需要排序相對較貴)。這將刪除最終結果中的重複項(因此,如果單個查詢中存在重複或來自單個SELECT的數據相同,則無關緊要)。 UNION是一套操作。

UNION ALL只是把結果放在一起:沒有排序,沒有重複刪除。這比UNION更快(或者至少不會更糟糕)。

如果您知道個別查詢不會返回重複結果,請使用UNION ALL。 (事實上​​,如果你需要這種行爲,最好假設UNION ALL並考慮UNION;在UNION中使用SELECT DISTINCT是多餘的)。