MySQL подзапрос не возвращает коррелирующие результаты - PullRequest
0 голосов
/ 07 марта 2020

У меня есть база данных для системы недвижимости, и я пытаюсь создать набор результатов, который содержит самую высокую цену из всех списков для каждого офиса в системе. Он возвращает правильную максимальную цену листинга, соотнесенную с правильными офисами, но адреса / города / штаты не соотносятся с наивысшим результатом листинга.

Вот мой SQL:


SELECT o.office_name, l.address, l.city, l.state, (SELECT MAX(l.listing_price)) AS highest_listing_price
FROM offices o
    JOIN agent_assignments aa
        ON o.office_key = aa.office_key
    JOIN client_listings cl
        ON aa.assignment_key = cl.assignment_key
    JOIN listings l
        ON cl.listing_key = l.listing_key
GROUP BY o.office_name;

Вот результат, который он дает:

+---------------------+------------------+--------------+-------+-----------------------+
| office_name         | address          | city         | state | highest_listing_price |
+---------------------+------------------+--------------+-------+-----------------------+
| Seqouia Real Estate | 838 Plum Rd      | Jasper       | IL    |             679000.00 |
| Mirage Property     | NULL             | Orchardville | IN    |             739000.00 |
| Excelsior Estates   | NULL             | Sandlake     | IL    |             605300.00 |
| Silverwood Realty   | 399 Apricot Ave  | Roseville    | IL    |             475000.00 |
| Hearthstone Nooks   | 290 Highridge Dr | Roseville    | IL    |             925000.00 |
+---------------------+------------------+--------------+-------+-----------------------+

А вот информация из таблиц, которые я использую для этого запроса:


DROP TABLE IF EXISTS offices;
CREATE TABLE offices
(
    office_key      INT     PRIMARY KEY,
    office_name     VARCHAR(50),
    address         VARCHAR(50),
    city            VARCHAR(30),
    state           CHAR(2),
    zip_code        VARCHAR(10),
    phone_number        VARCHAR(10),
    fax_number      VARCHAR(10),
    email_address       VARCHAR(50),
    remarks         VARCHAR(1000)
);

DROP TABLE IF EXISTS agent_assignments;
CREATE TABLE agent_assignments
(
    assignment_key      INT     PRIMARY KEY,
    agent_key       INT     REFERENCES agents (agent_key),
    office_key      INT     REFERENCES offices (office_key),
    office_manager_flag CHAR(1),
    date_assigned       DATE,
    end_date        DATE
);

DROP TABLE IF EXISTS listings;
CREATE TABLE listings
(
    listing_key     INT     PRIMARY KEY,
    listing_status      INT     REFERENCES listing_status (listing_status_key),
    listing_type        INT     REFERENCES listing_types (listing_type_key),
    date_listed     DATE,
    date_expires        DATE,
    date_unlisted       DATE,
    reason_unlisted     INT     REFERENCES unlisted_reasons (unlisted_reason_key),
    address         VARCHAR(50),
    city            VARCHAR(30),
    state           CHAR(2),
    zip_code        VARCHAR(10),
    lot_number      VARCHAR(50),
    residential_area    INT     REFERENCES residential_areas (residential_area_key),
    listing_price       DECIMAL(13, 2),
    listing_agreement_signed_date       CHAR(1),
    remarks         VARCHAR(1000)
);

DROP TABLE IF EXISTS client_listings;
CREATE TABLE client_listings
(
    client_listing_key  INT     PRIMARY KEY,
    listing_key     INT     REFERENCES listings (listing_key),
    assignment_key      INT     REFERENCES agent_assignments (assignment_key),
    client_key      INT     REFERENCES clients (client_key)
);

Одна вещь, которую я пытался использовать, это коррелировать адрес, но это привело к ошибке «подзапрос возвращает более одной строки»:

WHERE l.address = (SELECT l.address FROM listings l WHERE l.listing_price = (SELECT MAX(l.listing_price)))

Ответы [ 2 ]

1 голос
/ 07 марта 2020

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

Попробуйте это:

set @rownum := 0;

select * from (SELECT o.office_name, l.address, l.city, l.state, l.listing_price, (@rownum := @rownum + 1) AS rn
FROM offices o
    JOIN agent_assignments aa
        ON o.office_key = aa.office_key
    JOIN client_listings cl
        ON aa.assignment_key = cl.assignment_key
    JOIN listings l
        ON cl.listing_key = l.listing_key
order by l.listing_price desc)
where rn=1;
0 голосов
/ 07 марта 2020

Использовать оконные функции:

SELECT o.*
FROM (SELECT o.office_name, l.address, l.city, l.state, 
             l.listing_price AS highest_listing_price
             ROW_NUMBER() OVER (PARTITION BY o.office_name ORDER BY l.listing_price DESC) as seqnum
      FROM offices o JOIN
           agent_assignments aa
           ON o.office_key = aa.office_key JOIN
           client_listings cl
           ON aa.assignment_key = cl.assignment_key JOIN
           listings l
           ON cl.listing_key = l.listing_key
      ) o
WHERE seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...