2013-04-14 21 views
0

這裏不同的結果是SQL查詢相同的SQL查詢提供了SQL服務器和PHP的輸出

SELECT * FROM seedbed 
LEFT OUTER JOIN fertilizers AS seedfert ON seedfert.fert_protocol =seedbed.seed_protocol 
LEFT OUTER JOIN pesticides AS seedpest ON seedpest.pest_protocol = seedbed.seed_protocol 
LEFT OUTER JOIN fertilizers_list AS seedfert_list ON seedfert.fert_id =seedfert_list.id  
LEFT OUTER JOIN pesticides_list AS seedpest_list ON seedpest.pest_id = seedpest_list.id 
LEFT OUTER JOIN field ON field.field_protocol = seedbed.seed_protocol + "%"   
LEFT OUTER JOIN fertilizers AS fieldfert ON fieldfert.fert_protocol = field.field_protocol 
LEFT OUTER JOIN pesticides AS fieldpest ON fieldpest.pest_protocol = field.field_protocol 
LEFT OUTER JOIN stock ON stock.field_protocol = field.field_protocol 
LEFT OUTER JOIN fertilizers_list AS fieldfert_list ON fieldfert.fert_id =fieldfert_list.id 
LEFT OUTER JOIN pesticides_list AS fieldpest_list ON fieldpest.pest_id = fieldpest_list.id 
WHERE seedbed.seed_protocol LIKE "1/2013/2%" 
ORDER BY field_num; 

在PHP是完全一樣的,我使用笨,但我不使用這個活動記錄庫,因此是非常一樣。

$sql = "SELECT * FROM seedbed 
LEFT OUTER JOIN fertilizers AS seedfert ON seedfert.fert_protocol = seedbed.seed_protocol 
LEFT OUTER JOIN pesticides AS seedpest ON seedpest.pest_protocol = seedbed.seed_protocol 
LEFT OUTER JOIN fertilizers_list AS seedfert_list ON seedfert.fert_id = seedfert_list.id 
LEFT OUTER JOIN pesticides_list AS seedpest_list ON seedpest.pest_id = seedpest_list.id 
LEFT OUTER JOIN field ON field.field_protocol = seedbed.seed_protocol + '%'   
LEFT OUTER JOIN fertilizers AS fieldfert ON fieldfert.fert_protocol = field.field_protocol 
LEFT OUTER JOIN pesticides AS fieldpest ON fieldpest.pest_protocol = field.field_protocol 
LEFT OUTER JOIN stock ON stock.field_protocol = field.field_protocol 
LEFT OUTER JOIN fertilizers_list AS fieldfert_list ON fieldfert.fert_id =fieldfert_list.id 
LEFT OUTER JOIN pesticides_list AS fieldpest_list ON fieldpest.pest_id = fieldpest_list.id 
WHERE seedbed.seed_protocol LIKE '".$this->db->escape_like_str($ins_protocol)."%' 
ORDER BY field_num"; 
$query = $this->db->query($sql); 
$data = $query->result(); 
print_r($data); 

現在的問題是,在SQL Server中我得到的所有結果我應該得到儘管在PHP我不明白的我的頭兩個加入結果。我不知道爲什麼?

我希望有人知道發生了什麼事。

+0

請告訴我們你是如何在PHP跑的? –

+0

如果你有權訪問mysql,你可以打開查詢日誌記錄來查看是否有區別。 –

+0

變量$ this-> db-> escape_like_str($ ins_protocol)被雙重檢查,而不是一個問題,我也試過這一個單一的值,我得到同樣有問題的結果 – Akis

回答

0

正如OP暗示的那樣,這個問題很可能與多個表中的相同字段名有關,因此它們將在PHP中執行並返回時被組合/覆蓋。

解決方法是給所有具有衝突名稱唯一別名的字段/列。不幸的是,我想不出一種方法來做到這一點,所以我認爲它必須是一個手動過程。

也可能會出現表格被分組的問題,以防萬一我會拋出一堆括號!

SELECT seedbed.*, 
     seedfert.field1 AS seedfert_field1, seedfert.field2 AS seedfert_field2, 
     seedpest.field1 AS seedpest_field1, seedpest.field2 AS seedpest_field2, 
     seedfert_list.field1 AS seedfert_list_field1, seedfert_list.field2 AS seedfert_list_field2, 
     seedpest_list.field1 AS seedpest_list_field1, seedpest_list.field2 AS seedpest_list_field2, 
     etc... 
FROM (((((((((seedbed 
    LEFT OUTER JOIN fertilizers AS seedfert ON seedfert.fert_protocol = seedbed.seed_protocol) 
    LEFT OUTER JOIN pesticides AS seedpest ON seedpest.pest_protocol = seedbed.seed_protocol) 
    LEFT OUTER JOIN fertilizers_list AS seedfert_list ON seedfert.fert_id = seedfert_list.id) 
    LEFT OUTER JOIN pesticides_list AS seedpest_list ON seedpest.pest_id = seedpest_list.id) 
    LEFT OUTER JOIN field ON field.field_protocol = seedbed.seed_protocol + '%') 
    LEFT OUTER JOIN fertilizers AS fieldfert ON fieldfert.fert_protocol = field.field_protocol) 
    LEFT OUTER JOIN pesticides AS fieldpest ON fieldpest.pest_protocol = field.field_protocol) 
    LEFT OUTER JOIN stock ON stock.field_protocol = field.field_protocol) 
    LEFT OUTER JOIN fertilizers_list AS fieldfert_list ON fieldfert.fert_id =fieldfert_list.id) 
    LEFT OUTER JOIN pesticides_list AS fieldpest_list ON fieldpest.pest_id = fieldpest_list.id 
WHERE seedbed.seed_protocol LIKE '".$this->db->escape_like_str($ins_protocol)."%' 
ORDER BY field_num 
+0

是的,這是它的工作,現在我會嘗試找到更清潔的東西。謝謝你。 – Akis

+0

非常好。絕對讓我知道,如果你找到更乾淨的東西! :) – Nerdwood

0

在笨,運行:

echo $this->db->last_query(); 

,並比較您的非CI查詢

+0

是的,它是完全相同的查詢 – Akis

0

檢查整個數據庫的空值與加入可能會引發問題。由於NULL處理,Other people也有PHP返回奇怪結果的問題。

+0

我檢查了它,我意識到問題可能是因爲我加入兩次同一張表(肥料),我在PHP只有這個表格的第二個條目最有可能意味着覆蓋前一個條目。我想通過使用這張表的臨時名稱,我可能會解決這個問題。 – Akis

+0

這應該是確定的,因爲你每次都在別名表中。 – Nerdwood

+0

是的,但這就是爲什麼它在sql server中工作正常,但是當它將變量傳遞給php時,肥料的列名是相同的,沒有別名,所以我認爲這可能會導致問題。 – Akis

0

這部作品對我道:

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_WARNINGS ON 
SET ANSI_PADDING ON