回答
的from
子句中使用兩個表在功能上等同於一個cross join
:
select *
from A
cross join
B
這將返回A的一排中B.每一行;當B是空的,結果是空的了。你可以通過使用left join
來解決這個問題。使用left join
,即使其中一個表爲空,也可以返回行。例如:
select *
from A
left join
B
on 1=1
隨着病情1=1
永遠是真實的,這就像一個cross join
但它也適用於空表。
FYI,「在MySQL中,CROSS JOIN是一個等效於INNER JOIN的語法(它們可以相互替換) 「 – 2010-07-03 11:15:48
@Imre L:有趣。如果沒有'on'子句,即使MySQL允許'inner join'出於相同的目的,按照慣例使用'cross join'可能會更清楚一些! – Andomar 2010-07-03 11:20:54
是的。我個人更喜歡省略'INNER'和'CROSS'等詞,但是我不喜歡在連接表上使用某些條件時使用內聯CROSS JOIN。如果在返回0行的表A上使用WHERE子句(該表不是空的),則 – 2010-07-03 11:33:30
SELECT * FROM a LEFT JOIN b ON a.ID = b.ID
即使b爲空,也會返回所有內容。
您假定有可加入的字段,可能沒有共同的字段。沒有共同的領域,這是行不通的。在答案中看到ON 1 = 1。 – strattonn 2015-09-22 01:43:33
你應該做一個左連接。
像這樣
SELECT *
FROM A
LEFT JOIN B ON A.ID = B.ID
然後您會收到A中的行和相應行B中是否存在。
你認爲有加入的領域,可能沒有共同的領域。沒有共同的領域,這是行不通的。在答案中看到ON 1 = 1。這是整個問題的關鍵,加入沒有公共領域的空集。 – strattonn 2015-09-22 01:44:25
是的,你是對的,在這種情況下,需要交叉連接或條件1 = 1,這幾乎是相同的。 – 2015-09-22 23:27:14
上面提到的查詢顯示兩個表的聯接,如果一個包含2條記錄並且b包含7條記錄,它將顯示7 * 2 = 14條記錄。在你的情況下,其中一個表是空的(有0個記錄),它不會顯示任何數據。如果仍然想要顯示數據並且表與沒有任何關係,則需要檢查兩個表的計數是否大於0。否則,顯示僅來自一個非空的表的記錄。
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id
在這個例子中ID
僅僅是例子名連接鍵
你認爲有加入的領域,可能沒有共同的領域。沒有共同的領域,這是行不通的。在答案中看到ON 1 = 1。 – strattonn 2015-09-22 01:44:03
- 1. 從一個mysql中選擇多個表
- 2. 選擇多個表MySQL
- 3. 從多個MySQL表選擇
- 4. PHP MySQL選擇多個表
- 5. MySQL:選擇多個表格
- 6. Mysql選擇多個表,但內部連接在一個表上
- 7. 的MySQL選擇多個表一次
- 8. 選擇一個MySql表
- 9. 在PHP中選擇多個表MYSQL
- 10. 在MySQL選擇從多個表列
- 11. 在mysql中選擇連接多個表?
- 12. 在MYSQL的多個表中選擇MAX
- 13. MySQL從多個表中選擇到一個表中
- 14. MySQL的一個表中選擇字段不在另一個表
- 15. 當一個表爲空或不爲空時選擇兩個表格
- 16. mysql從另一個表中選擇一行的多個列
- 17. 選擇多個表
- 18. 選擇多個表
- 19. MySQL:從多個表中選擇DISTINCT
- 20. Mysql的多個表中選擇
- 21. MySQL的選擇從多個表
- 22. 選擇從多個表的mysql
- 23. 的MySQL/PHP選擇並從多個表
- 24. MySQL選擇RANDOM與多個表
- 25. 從多個表的MySQL精梳選擇
- 26. 從多個表中選擇mysql Java
- 27. 用MySql選擇多個表php
- 28. 從mysql中的多個表中選擇
- 29. MySQL選擇不同跨多個表
- 30. MySQL的選擇從多個表
http://dev.mysql.com/doc/refman/5.0/en/join.html 您正在使用的形式'INNER JOIN'其結果是x * y記錄,所以如果其中1個有0行,那麼x * 0 = 0. – 2010-07-03 11:10:51