2012-05-15 18 views
0

我有一個SQL查詢工作正常的程度。MySQL - 排除行如果沒有行存在從左外部連接

LEFT OUTER JOINs可以正常工作,但是如果mdl_modules或mdl_resource中沒有記錄,它會出現NULL。

如何從mdl_course_modules中排除記錄WHERE LEFT OUTER JOIN中沒有記錄?

我認爲我會使用ISNULL(),但不能確定正確的語法與我的查詢合併。

這裏是我的查詢:

SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", "cm.id AS theid, m.name AS mname, r.name AS resourcename, r.summary AS resourcesummary, 
     FROM_UNIXTIME(cm.added, '%D %M %Y') AS dateadded")." 
     FROM mdl_course_modules cm 
     LEFT OUTER JOIN mdl_modules m on cm.module = m.id 
     LEFT OUTER JOIN mdl_resource r on cm.instance = r.id 
     WHERE m.name = 'resource' AND cm.visible = 1 
     $scourse 
     $sWhere 
     $sOrder 
     $sLimit 
+2

使用內部連接而不是外部連接。瞭解[SQL連接](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html)。 – eggyal

+0

輝煌,謝謝。說實話,我從來沒有看過SQL連接。 – Codded

回答

1

通常這會通過切換到INNER JOIN來完成,但在INNER JOIN MySQL是等同於一個CROSS JOIN這樣就不會實際幫助。

爲了解決這個問題,添加所需的WHERE條件下,利用ISNULL

SELECT ... 
    FROM_UNIXTIME(cm.added, '%D %M %Y') AS dateadded")." 
    FROM mdl_course_modules cm 
    LEFT OUTER JOIN mdl_modules m on cm.module = m.id 
    LEFT OUTER JOIN mdl_resource r on cm.instance = r.id 
    WHERE m.name = 'resource' AND cm.visible = 1 
     && (!ISNULL(m.name) || !ISNULL(r.name)) 
+0

在什麼情況下,INNER JOIN(仍然指定連接條件)與MySQL中的'CROSS JOIN'相比其他任何RDBMS都更加等價嗎? – eggyal

+0

@eggyal:*「在MySQL中,JOIN,CROSS JOIN和INNER JOIN是語法等價物(它們可以相互替換)。在標準SQL中,它們不是等價的。」* – Jon

+0

哇。 INNER JOIN與CROSS JOIN完全不同 - 這些開發者吸菸的地方是什麼? –

1

WHERE m.name = '資源' AND cm.visible = 1 AND(m.id IS NOT NULL或R。 ID不是NULL)