2011-08-10 9 views
2

次のSQLステートメントをPHPで動的に生成していますが、返されるレコードに問題があります。中央にある "IN"ステートメントは、コンマで区切られた値の大きなリストを持ち、特定のislandIDに対して6レコードを返します。しかし、文全体を実行したときに生成される最終的な結果は、前述の同じislandIDの22レコードになります。私は必要に応じてより多くの情報を提供することができます。SQL "In"ステートメント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のビューを作成して2つのテーブルをマージしてislandIDを取得し、このようにして作業することを計画しています。これについての考えは?

+1

「AND」演算子は「&&」ではなく「AND」であってはなりませんか?これは何DBMSですか? – Phil

+0

@Phil DBMSは、mySQLバージョン5.0.91を実行しているphpMYAdminです。あなたが提案し、すべての "&&"演算子を "AND"に変更しました。結果はまったく同じでした。他の思考? – MingMing

+0

MySQLはいずれの演算子も許可すると思います – Phil

答えて

2

私の推測では、3つのテーブル(島、イメージ、リゾート)とリゾート/イメージに参加しているということは、多対1の関係ですか?

あなたが言うように、特定のIslandIDについては、6つのリゾートがあります。しかし、それぞれのリゾートに3枚の写真がある場合は、合計18行が返されます。それぞれのリゾートとリゾートの組み合わせにつき3行です。

+0

"parentObjectID = island.islandID"のように、islandテーブルとimagesテーブルの間に多対1の関係を実行しています。 "imageType = 1"と記述されているWHERE句は、画像を島の画像に限定します。 PHPを介して私はユーザーが複数の画像をアップロードすることを許可していません。何らかの理由で重複レコードが存在しないことを確認するためにDBをチェックする必要があります。 – MingMing

0

これはあなたのDBMSを知らなくても本当に答えにくいですが、

の列にresortテーブルでNULLが許可されていますか?

これは、サブクエリが3番目の結果(TRUE/FALSEからTRUE/FALSE/UNKNOWNまで)を導入するため、サブクエリを混乱させる可能性があります。これを解決するには

、2つのオプションがあります。

A)parentIslandIDの列にNULLを許可し、デフォルト値(推奨) Bを提供しないように、テーブルのスキーマを変更する)COALESCE/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列にNULL値を含めることは不可能です。これはPHPで満たされており、ユーザーがどこからでも入力することはありません。しかし、アイデアをありがとう。 – MingMing

1

上述したように、それは、Wこの質問に答えるのは難しいですあなたのデータベースを見ることなく。私が見ることのできるもう1つの可能性は、選択しているすべての列でグループ化していないことです。 Oracleでは、これによりエラーが発生し、クエリは実行されませんでした。

私はそれはあなたが経験しているもののようなものかもしれないPHPで何が起こるかわからないんだけど、少なくとも、このリンクに従っ

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

。集計関数ではない他のすべての列、すなわち

islandName、island.longDesc、imageLocationを追加してみてください、句によって、あなたのグループに

をresort.resortID。

関連する問題