MySQL子查询未返回相关结果

MySQL子查询未返回相关结果,mysql,sql,subquery,Mysql,Sql,Subquery,我有一个房地产系统的数据库,我正在尝试生成一个结果集,其中包含系统中每个办公室所有挂牌中最高的挂牌价格。它将返回与正确办事处相关的正确最高挂牌价格,但地址/城市/州与最高挂牌价格结果不相关 以下是我的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_assignmen

我有一个房地产系统的数据库,我正在尝试生成一个结果集,其中包含系统中每个办公室所有挂牌中最高的挂牌价格。它将返回与正确办事处相关的正确最高挂牌价格,但地址/城市/州与最高挂牌价格结果不相关

以下是我的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)))

您需要首先识别具有最高标价的记录,然后获取所有必需的列。您的查询只标识标价的最大值,而不标识与之关联的其他列

试试这个:

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;
使用窗口功能:

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;

感谢您提供表格定义。您是否能够提供示例数据以及您的预期输出?当所需输出未知时,很难知道您提供的输出有什么问题!没有相应数据集的结果集就像没有棒棒糖的棍子一样有趣