Оператор SQL «In» возвращает 6 записей ... общий оператор SQL возвращает 22 записи - PullRequest
2 голосов
/ 10 августа 2011

Я сгенерировал следующий оператор SQL динамически с PHP и у меня возникла проблема с записями, которые он возвращает.Оператор "IN", расположенный в середине с большим списком значений, разделенных запятыми, возвращает 6 записей для конкретного islandID.Тем не менее, окончательные результаты, которые генерируются при выполнении всего оператора, дают мне 22 записи для того же islandID, упомянутого выше ... любая помощь приветствуется.При необходимости я могу предоставить больше информации.

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" с другой таблицей.Единственное отличие состоит в том, что указанная таблица содержит islandID, который я использовал в своем операторе IN.Поэтому я планирую создать представление в СУБД для объединения двух таблиц, чтобы получить идентификатор IslandID и работать с ним таким образом.Есть мысли по этому поводу?

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

Я предполагаю, что вы объединяете 3 таблицы (остров, изображения, курорт), а отношение курортов / изображений является отношением "многие к одному"?

Итак, для определенного IslandID, как вы говоритеУ вас есть 6 курортов.Но если на каждом курорте есть 3 изображения, вы получите всего 18 строк, по 3 на каждую комбинацию остров / курорт.

1 голос
/ 11 августа 2011

Как отмечалось выше, трудно ответить на этот вопрос, не увидев вашу базу данных. Еще одно возможное, что я вижу, это то, что вы группируете не по всем выбранным столбцам. В оракуле это может привести к ошибке, и запрос не будет запущен.

Я не уверен, что происходит в php, но хотя бы по этой ссылке

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

Это может быть что-то вроде того, что вы испытываете. Попробуйте добавить все остальные столбцы, которые не являются агрегатными функциями, т.е.

islandName, island.longDesc, imageLocation, resort.resortID

в вашу группу по предложению.

0 голосов
/ 10 августа 2011

Это действительно трудно ответить, не зная вашей СУБД, но;

Допускает ли таблица resort пустые значения в столбце parentIslandID?

Если это так, это может запутать ваш подзапрос, поскольку он вводит третий результат (то есть от ИСТИНА / ЛОЖЬ до ИСТИНА / ЛОЖЬ / НЕИЗВЕСТНО).

Чтобы решить эту проблему, есть два варианта:

a) изменить схему для таблицы, чтобы в столбце parentIslandID не допускалось пустое значение, и указать значение по умолчанию (предпочтительно) б) измените ваш запрос с помощью coalesce / isnull (синтаксис зависит от вашей СУБД):

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

Для дальнейшего использования, опять же в зависимости от вашей СУБД: http://msdn.microsoft.com/en-us/library/ms191504.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...