MySQL子查询未返回相关结果
我有一个房地产系统的数据库,我正在尝试生成一个结果集,其中包含系统中每个办公室所有挂牌中最高的挂牌价格。它将返回与正确办事处相关的正确最高挂牌价格,但地址/城市/州与最高挂牌价格结果不相关 以下是我的SQL: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
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;
感谢您提供表格定义。您是否能够提供示例数据以及您的预期输出?当所需输出未知时,很难知道您提供的输出有什么问题!没有相应数据集的结果集就像没有棒棒糖的棍子一样有趣