MYSQL LEFT JOIN возвращает дубликат таблицы с результатами - PullRequest
4 голосов
/ 10 марта 2012

Обновление. Прокрутите до боттема для SQL-кода и вывода. Я недавно начал работать над базой данных квартир.База данных содержит 2 таблицы

Таблица «Недвижимость» хранит информацию об основных квартирных комплексах (контактные данные и фотографии).На него ссылается столбец propid

Таблица b "Планы этажей" содержит информацию об отдельных арендуемых единицах.информация о ценах, площадь участка и тип квартиры.На таблицу floorplan также ссылается столбец propid, чтобы позволить нам связать две таблицы вместе.У него также есть собственный уникальный идентификатор, но он не используется.

Обычно на каждый комплекс приходится 5-10 этажей.

Я создаю интерфейс поиска по интерфейсу для наших клиентов на нашем веб-сайте.Мне нужна возможность искать недвижимость с планами этажей, которые соответствуют критериям поиска.но, выполняя оператор соединения, я замечал, что он продолжает давать мне список с тем же свойством в нем каждый раз, когда обнаруживается, что один из его этажей соответствует критериям поиска.

Я провел небольшое исследование по этому вопросу.Наиболее распространенный ответ - SELECT DISTINCT.

Проблема в том, что в результате мне нужно больше, чем просто пропид.

Я пытался сделать что-то вроде этого:

SELECT DISTINCT (p.propid), p.*, f.* FROM property AS p 
LEFT JOIN floorplans AS f ON p.propid = f.propid
WHERE f.pricespecial BETWEEN [min_price] AND [max_price];

[min_price] и [max_price] предоставляются пользователем.

Предполагаемым результатом будет список всех свойств, имеющих планы этажей, которые соответствуют всем критериям поиска пользователей.Но я не хочу, чтобы одно и то же свойство возвращалось для каждой подходящей единицы.

Когда я запускаю этот запрос, я все еще получаю дублирующиеся свойства

В прошлом я просто запускал сценарий фильтра для xmlканал, содержащий данные.Сценарий будет определять максимальную и минимальную цену в свойстве givin и добавлять эти значения во 2 вновь создаваемых столбца таблицы свойств price_min и price_max.до сих пор это было достаточно хорошо, но компания настаивала на более точных результатах поиска.

Единственный другой вариант, который я вижу, - это просто выполнить запрос, возвращая только пропид DISTINCT.Затем выполните второй запрос для получения фактических данных.

IE

$sql = "SELECT DISTINCT p.propid FROM property as f" .
       "LEFT JOIN floorplans AS f" . 
       "WHERE f.price BETWEEN " . $_REQUEST['price_min'] . " AND " . $_REQUEST['price_max'] . "

EDIT **

некоторые примеры вывода с использованием недавно пересмотренного sqlstatment.

propid  name    pricespecial  
4230A   2222 Smith Street   $1225-1450  
4230A   2222 Smith Street   $1895-2045  
4230A   2222 Smith Street   $2220  
4679A   City Place Midtown  $1230-1599  
4679A   City Place Midtown  $1595-1650  
4679A   City Place Midtown  $1699-2195  
4572A   Gables Memorial Hills   $1308-2159  
4572A   Gables Memorial Hills   $2050-2693  
4606A   Venue Museum District   $1535-1930  
4606A   Venue Museum District   $1980-2550  

У меня были проблемы с публикацией этого комментария, поэтому я просто отредактировал свой вопрос.

Ответы [ 2 ]

3 голосов
/ 10 марта 2012

Вы получаете эти дураки, потому что вы просите их.

Вы хотите

   SELECT DISTINCT p.propid, p.*
     FROM property   AS p 
LEFT JOIN floorplans AS f ON p.propid = f.propid
    WHERE f.price BETWEEN [min_price] AND [max_price]

Когда вы говорите SELECT ..., f.*, что вы говорите, верните мне ряддля каждой отдельной комбинации property и floorplan.Но вам нужны только отдельные property предметов.

В общем, хорошая идея - указать конкретные столбцы, которые вы хотите.Избегайте p.*, чтобы получить все столбцы.Это особенно верно, когда вы используете SELECT DISTINCT.

1 голос
/ 10 марта 2012

Мне больше нравится без четких:

SELECT p.*
FROM property AS p 
WHERE EXISTS (SELECT NULL FROM floorplans AS f WHERE f.propid = p.propid AND f.price BETWEEN [min_price] AND [max_price])
...