2013-10-29 169 views
0

我想在當前表格被引用到的另一個表格中的值之後進行排序。我的查詢是這樣的:左連接多個表格和條件

SELECT o._id, 
     o.titel, 
     o.beschreibung 
FROM `objekt` AS o, 
     `objekt_einzel` AS oe, 
     `objekt_einzel_immobilie` AS oei, 
     `objekt_art` AS oa, 
     `verortung` AS v 
     #here 
     ,`person` AS p, 
     `person_bauträger` AS pb 
     #end 
WHERE o._id = oe.objekt_id 
     AND oe._id = oei.objekt_einzel_id 
     AND oa._id = o.objekt_art_id 
     AND o.ort_id = v._id 
     #here 
     AND oe.bauträger_id = pb._id 
     AND pb.person_id = p._id 
     #end 
     AND (oei.justimmo_objekt_id = "0" 
       OR oei.justimmo_objekt_id IS NULL 
       OR oei.justimmo_objekt_id = "") 
#here 
ORDER BY p.firmenbezeichnung ASC 

查詢工作正常,但它表明我只值如果oe.bauträger_id設置。我也想要null值。所以我需要一個左連接。我嘗試了不同的東西,但我只收到像unknown column這樣的消息,或者我得到的結果太多。

我試圖把它簡化爲這樣:

SELECT o._id, 
     o.titel, 
     o.beschreibung 
FROM `objekt` AS o, 
     `objekt_einzel` AS oe, 
     (SELECT oe.bauträger_id 
     FROM objekt o, objekt_einzel oe, objekt_einzel_immobilie oei 
     WHERE o._id = oe.objekt_id AND oe._id = oei.objekt_einzel_id) AS menge1 
LEFT JOIN 
     (SELECT pb._id AS bauträger_id 
     FROM person p, person_bauträger pb 
     WHERE p._id = pb.person_id) AS menge2 
ON menge1.bauträger_id = menge2.bauträger_id 
WHERE o._id = oe.objekt_id AND oe.bauträger_id = menge1.bauträger_id 

但在這裏我得到一個太大的結果集。我不知道如何更好地解釋這一點。數據集太大而無法創建示例。我希望你明白我的意思。

+0

第一步使用正確的連接語法.... –

+0

@TonyHopkinson我同意使用'JOIN ... ON'語法而不是隱式連接通常會非常有用,因爲它可以使事情更清晰,但在這種情況下,它不是絕對的必要。 – Palec

+0

@Palec這不是絕對有必要不拍攝自己的腳。 –

回答

1
SELECT o._id, 
     o.titel, 
     o.beschreibung 
FROM `objekt` AS o 
     JOIN `objekt_einzel` AS oe ON o._id = oe.objekt_id 
     JOIN `objekt_einzel_immobilie` AS oei ON oe._id = oei.objekt_einzel_id 
     JOIN `objekt_art` AS oa ON o.objekt_art_id = oa._id 
     JOIN `verortung` AS v ON o.ort_id = v._id 
     LEFT JOIN `person_bauträger` AS pb ON oe.bauträger_id = pb._id 
     LEFT JOIN `person` AS p ON pb.person_id = p._id 
WHERE oei.justimmo_objekt_id = "0" 
     OR oei.justimmo_objekt_id IS NULL 
     OR oei.justimmo_objekt_id = "" 
ORDER BY p.firmenbezeichnung ASC 

這第二次嘗試應該工作,因爲它只是一個使用JOIN語法改寫的原代碼,並與LEFT JOIN的。

+0

謝謝!這工作!當我必須使用'LEFT JOIN'和'JOIN'時,你能否請exlain?有一個通用規則嗎?我想我需要'JOIN',因爲否則表格將是未知的。在這種情況下,是否與'LEFT JOIN'相關的訂單? – grabner

+0

@gabner在SQL中,[NULL永遠不會等於NULL](http://stackoverflow.com/questions/1843451/why-does-null-null-evaluate-to-false-in-sql-server)。如果您在包含NULL的列上連接兩個表,則這些行將被內部聯接('JOIN','INNER JOIN')忽略。左外連接('LEFT JOIN','LEFT OUTER JOIN')包含第一個表的NULL鍵,第二個外連接的右外連接('RIGHT JOIN','RIGHT OUTER JOIN') OUTER JOIN','FULL OUTER JOIN';未在MySQL中實現)。未在原始表中設置的列在這些行中填充NULL。 – Palec

+0

@gabner另請參見[SQL連接之間的差異]上的這個問題(http://stackoverflow.com/questions/5706437/whats-the-difference-between-inner-join-left-join-right-join-and-full - 加入)和[更好的](http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-join)。另外[示例](http://stackoverflow.com/a/5875572/2157640)可以幫助理解。外部聯接通常用於部分信息是可選的,而您希望其餘部分不管其存在。 – Palec