2011-08-10 127 views
2

我用PHP動態生成下面的SQL語句時遇到與它的返回記錄的問題。位於中間的「IN」語句帶有大逗號分隔值列表,爲特定的島ID返回6條記錄。然而,運行整個語句時產生的最終結果爲我提供了上面提到的同一個島ID的22條記錄......任何幫助都是值得讚賞的。如果需要,我可以提供更多信息。SQL「在」語句,返回6條......整個SQL語句返回22條記錄

SELECT islandID AS parentIslandID, islandName, island.longDesc, 
imageLocation, COUNT(resortID) AS totalResorts, resort.resortID 
FROM island, images, resort 
WHERE parentIslandID = island.islandID 
&& parentObjectID = island.islandID 
&& imageType = 1 
&& island.islandID IN (
    SELECT parentIslandID FROM resort WHERE resortID IN (
     59,62,65,69,71,72,74,75,76,82,86,89,91,93,95,105, 
     106,116,117,118,120,121,122,123,124,125,126,127, 
     131,145,146,150,157,159,160,167,170,174,176,185,188,189,193, 
     194,198,199,200,203,205,213,217 
    ) 
) 
&& (search_Inclusive = '-1' || search_Inclusive = '0') 
&& (search_onBeach = '-1' || search_onBeach = '0') 
&& (search_wedCoord = '-1' || search_wedCoord = '0') 
&& (search_roomRate >= '0' && search_roomRate <= '1000') 
&& (search_HotelSuite = '-1' || search_VillaCondo = '-1') 
&& (passportReq = '-1' || passportReq = '0') 
&& (wideAccept = '-1' || wideAccept = '0') 
&& (daysSearchable <= '3') 
&& (search_airportDist <= '6') 
&& resort.active = '-1' 
GROUP BY resort.parentIslandID 
ORDER BY totalResorts DESC 

新想法:我在做與另一個表「IN」操作非常相同的事情。唯一的區別是表格中包含我在「IN」語句中使用的islandID。所以我打算在DBMS中創建一個視圖來合併兩個表以獲取我的islandID並以此方式處理它。對此有何想法?

+1

不應該「AND」運算符是「AND」,而不是「&&」?這是什麼DBMS? – Phil

+0

@Phil DBMS是運行mySQL版本5.0.91的phpMYAdmin。我按照你的建議做了,並把所有「&&」操作符改爲「AND」。結果完全一樣。任何其他想法? – MingMing

+0

我猜MySQL允許運營商 – Phil

回答

2

我的猜測是,你在3個表(島,圖像,度假區)和度假村/圖像加盟是一個多到一的關係?

因此,對於一個特定的IslandID,就像你說的,你有6個景區。但是如果每個度假村都有3張照片,則總共會返回18行,每個島嶼/度假村的組合總數爲3。

+0

我正在執行島與圖像表之間的多對一關係,如「parentObjectID = island.islandID」所示。說明「imageType = 1」的WHERE子句將圖像限制爲孤島圖像。通過PHP,我不允許用戶上傳多個圖像。我必須檢查數據庫以確保重複記錄因某種原因不存在。 – MingMing

0

這是真的很難不知道你的DBMS,但回答;

是否resort表允許在parentIslandID列空?

如果以它引入了第三個結果,這可能混淆你的子查詢(即從TRUE/FALSE爲TRUE/FALSE /未知)。

要解決這個問題,有兩個選項:

一)更改架構的表不允許空在parentIslandID列並提供一個默認值(首選) b)用聚結/ ISNULL修改查詢(語法取決於你的DBMS):

[...]  
island.islandID IN (
SELECT coalesce(parentIslandID,-1) FROM resort WHERE [...] 

爲了您進一步參考,再根據你的DBMS:http://msdn.microsoft.com/en-us/library/ms191504.aspx

+0

DBMS是運行mySQL版本5.0.91的phpMYAdmin。從邏輯上講,parentIslandID列不可能包含空值。這是通過PHP填充的,不是用戶輸入的任何地方。謝謝你的想法。 – MingMing

1

如上所述,這是很難回答這個問題w ^沒有看到你的數據庫。我可以看到的另外一個可能是,你並不是按照你選擇的所有列進行分組。在oracle中,這會導致錯誤,並且查詢不會運行。

我不知道在PHP中會發生什麼,但至少根據這個鏈接

http://www.w3schools.com/sql/sql_groupby.asp

這可能是像你正在經歷。嘗試添加其他所有列不屬於聚合函數,即

islandName,island.longDesc,imageLocation,by子句resort.resortID

到組。