2011-12-28 50 views
0

我現在的SQL是:MySQL的左連接,其中連接表是空

SELECT * FROM `node` 
LEFT JOIN `field_data_field_area_of_study_category` 
ON `field_data_field_area_of_study_category`.`entity_id` = `node`.`nid` 
WHERE `node`.`type` = 'area_of_study' 
GROUP BY `node`.`nid` 

現在,使其工作,我在列運行foreach環路is_null()

我試圖在SQL查詢中模擬is_null()檢查。

感謝您的閱讀。

編輯 這是運行is_null() foreach循環。我認爲更好的方式來問我的問題將是:如何使SQL返回只有行從節點表中沒有匹配的field_data_field_area_of_study_category表?

foreach($aos_nodes as $aos_node): 
    if (is_null($aos_node->field_area_of_study_category_tid)): 
    $menu_item_display[$aos_node->title] = array(
     'id' => $aos_node->nid, 
     'type' => 'node', 
     'children_markup' => '', 
     'icon' => '', 
     'name' => $aos_node->title, 
     'href' => drupal_get_path_alias('node/'.$aos_node->nid), 
    ); 
    endif; 
endforeach; 
+3

有什麼問題嗎? – 2011-12-28 22:02:02

+2

更具體到@SergeiTulentsev - 如果加入的值爲空,你想要做什麼? – Eric 2011-12-28 22:03:10

+2

'WHERE field IS NULL'? ['ISNULL(場)'](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_isnull)? ['IFNULL(field,0)'](http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull)? – 2011-12-28 22:03:53

回答

5

要返回行那裏沒有匹配的一個:

SELECT * FROM `node` 
LEFT JOIN `field_data_field_area_of_study_category` 
ON `field_data_field_area_of_study_category`.`entity_id` = `node`.`nid` 
WHERE `node`.`type` = 'area_of_study' 
    and `field_data_field_area_of_study_category`.`entity_id` is null 
GROUP BY `node`.`nid` 

此外,還可以使用not exists

select 
    * 
from 
    node n 
where 
    n.type = 'area_of_study' 
    and not exists (
     select 
      1 
     from 
      field_data_field_area_of_study_category f 
     where 
      f.entity_id = n.nid 
    ) 
+0

添加了一個回答w /社區Wiki來放棄代表點,但至少可以在那裏得到您需要的答案。 – Eric 2011-12-28 22:11:39

+0

這正是我所需要的。我一直在努力尋找使用ON語法在LEFT JOINing時過濾結果的方法,但這是我尋找的110%。謝謝! – 2011-12-28 22:13:42

+1

啊,是的,那個錯誤。值得一提的是,'ON'絕不會過濾掉行,它只能指定一個表中的哪些行屬於另一個表的行。連接類型和where子句是過濾行的兩件事。這是一個微妙的差異(尤其是內部連接),但是當你編寫越來越複雜的SQL時,這一點非常重要。 – Eric 2011-12-28 22:17:00