2009-09-07 117 views
3

考慮下面的查詢:MySQL的解釋異常

select FEE_NUMBER 
from CARRIER_FEE CF 
left outer join CONTYPE_FEE_LIST cfl on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3 
where CF.SEQ_NO = (
    select max(CF2.SEQ_NO) from CARRIER_FEE CF2 
    where CF2.FEE_NUMBER=CF.FEE_NUMBER 
    and CF2.COMPANY_ID=CF.COMPANY_ID 
    group by CF2.FEE_NUMBER) 
group by CF.CAR_FEE_ID 

在我的筆記本電腦這個不返回任何結果。在我的服務器上使用完全相同的(轉儲)數據庫,它會返回結果。

如果我跑我的筆記本電腦的解釋,我得到這個

| id | select_type  | table | type | possible_keys        | key     | key_len | ref     | rows | Extra          | 
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+ 
| 1 | PRIMARY   | CF | index | NULL          | PRIMARY    | 8  | NULL     | 132 | Using where         | 
| 1 | PRIMARY   | cfl | ref | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8  | odysseyB.CF.CAR_FEE_ID | 6 |            | 
| 2 | DEPENDENT SUBQUERY | CF2 | ref | FK_SURCHARGE_1        | FK_SURCHARGE_1  | 8  | func     | 66 | Using where; Using temporary; Using filesort | 

而我所有的其他服務器也給出了這樣的(注意裁判列的差異)

| id | select_type  | table | type | possible_keys        | key     | key_len | ref     | rows | Extra          | 
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+ 
| 1 | PRIMARY   | CF | index | NULL          | PRIMARY    | 8  | NULL     | 132 | Using where         | 
| 1 | PRIMARY   | cfl | ref | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8  | odysseyB.CF.CAR_FEE_ID | 6 |            | 
| 2 | DEPENDENT SUBQUERY | CF2 | ref | FK_SURCHARGE_1        | FK_SURCHARGE_1  | 8  | odysseyB.CF.COMPANY_ID | 66 | Using where; Using temporary; Using filesort | 

如果我刪除連接,子查詢或最後一組 - 然後我得到預期的結果。

我假設這是一個配置問題,但它不是我以前見過的。有人知道可能會導致這種情況嗎?

我的筆記本電腦在運行MySQL 5.0.41的OSX 10.6。另一臺運行OSX 10.5.7和MySQL 5.0.37的筆記本電腦運行良好,運行MySQL 5.0.27的Linux服務器也是如此。

任何人都可以解釋一個解釋計劃使用ref = func和另一個使用ref = odysseyB.CF.COMPANY_ID之間的區別嗎?

謝謝。

+0

哇!相同的數據集?不同的結果?這是一個非常嚴重的問題... – 2009-09-07 18:24:10

+0

是的。相同的數據集。不同的結果。不好。 – Damo 2009-09-07 18:29:25

+1

你確定它是相同的數據集嗎?你的解釋中的行有點不同。201 vs 202 16 vs 18 100 vs 101 – Rufinus 2009-09-07 20:13:44

回答

0

我不知道它爲什麼會給出不同的結果。您的不需要具有完全相同的數據轉儲,因爲您的EXPLAIN報告中報告的行數不同。我建議做一些簡單的查詢來測試你的假設。

同時仔細檢查你是否真的在兩臺服務器上執行完全相同的SQL查詢。例如,如果您無意中將左外部聯接更改爲內部聯接,則可能會使整個查詢不返回結果。

BTW,切到你的問題,但我解決了這些類型的外查詢的「每組的最大行」加盟:

select FEE_NUMBER 
from CARRIER_FEE CF 
left outer join CARRIER_FEE CF2 
    on CF.FEE_NUMBER = CF2.FEE_NUMBER and CF.COMPANY_ID = CF.COMPANY_ID 
    and CF.SEQ_NO < cf2.SEQ_NO 
left outer join CONTYPE_FEE_LIST cfl 
    on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3 
where CF2.SEQ_NO IS NULL 
group by CF.CAR_FEE_ID; 

這種類型的解決方案往往比相關子查詢解決方案,你的速度快得多,目前正在使用。我不認爲這可能會改變查詢的結果,我只是提供它作爲一個選項。

+0

謝謝。這當然是一種選擇。我已經更新瞭解釋計劃。他們正在使用完全相同的數據集。 – Damo 2009-09-08 09:31:32

1

在兩臺機器上:

mysql> SHOW CREATE TABLE CARRIER_FEE CF; 

確保兩個表類型的發動機是相同的。

此外,由於您在機器上使用OS X 10.6時出現錯誤?也許該操作系統上的數據類型具有不同於10.5.x的特性。

似乎人們對雪豹有兼容性問題。嘗試在10.6筆記本電腦上安裝MySQL 5.4。

http://forums.mysql.com/read.php?10,278942,278942#msg-278942