当我试图将这个嵌套在我的头上时,我的脑袋正在变成糊状。
所以基本上我有两张桌子:
经纪人,这是我的“用户”表:
╔══════════╦════════════╦
║ ID ║ EMAIL ║
╠══════════╬════════════╬
║ 1 ║ 1@email.co ║
║ 2 ║ 2@email.co ║
║ 3 ║ 3@email.co ║
╚══════════╩════════════╝
房屋,是用户添加的房屋。目前用户和房屋通过电子邮件列连接(我知道,使用ID更有意义):
╔══════════╦════════════╦════════════╦
║ ID ║ TYPE ║ EMAIL ║
╠══════════╬════════════╬════════════╬
║ 1 ║ 1 ║ 1@email.co ║
║ 2 ║ 3 ║ 1@email.co ║
║ 3 ║ 2 ║ 1@email.co ║
║ 4 ║ 3 ║ 1@email.co ║
║ 5 ║ 3 ║ 1@email.co ║
║ 6 ║ 2 ║ 1@email.co ║
║ 7 ║ 3 ║ 1@email.co ║
║ 8 ║ 1 ║ 2@email.co ║
║ 9 ║ 1 ║ 2@email.co ║
║ 10 ║ 2 ║ 2@email.co ║
║ 11 ║ 2 ║ 2@email.co ║
║ 12 ║ 3 ║ 2@email.co ║
║ 13 ║ 3 ║ 3@email.co ║
║ 14 ║ 2 ║ 3@email.co ║
║ 15 ║ 3 ║ 3@email.co ║
║ 16 ║ 1 ║ 3@email.co ║
║ 17 ║ 3 ║ 3@email.co ║
║ 18 ║ 2 ║ 3@email.co ║
║ 19 ║ 2 ║ 3@email.co ║
║ 20 ║ 3 ║ 3@email.co ║
╚══════════╩════════════╩════════════╝
现在我想做的是,我想选择所有类型3的经纪人作为最高,最受欢迎的房子。因此,例如,如果房屋类型3代表“公寓”,我想找到出售公寓作为其最受欢迎类型的经纪人。
我目前的查询是:
SELECT b.id, b.email, h.email, h.type, h.total
FROM brokers b
INNER JOIN (
SELECT COUNT( * ) AS total, email, type
FROM house
GROUP BY email, type
ORDER BY total DESC
)h ON b.email = h.email
AND h.type = "3"
ORDER BY b.id DESC
现在,这只选择该经纪商对类型3的房屋总数。它不仅选择类型3是其最受欢迎类型的经纪人。
现在要做到这一点,我需要使用所谓的“Groupwise Max”。但我不能在count(*)上使用max(),如:
MAX(COUNT(*)) as max_value
所以我想我需要做的是将查询进一步嵌套到其他子查询中,然后选择最大值。
我一直试图把它弄好一段时间,但我无法理解它。有人可以帮忙吗?
编辑: 预期产出: 根据上表,经纪人1@email.co得到:
Broker 2@email.co得到:
Broker 3@email.co得到:
由于1@email.co和3@email.co最常销售House Type 3,因此它们应包含在输出中。 2@email.co不会将类型3作为他最受欢迎的类型出售,因此不应将其包含在结果中。
所以输出:
╔══════════╦════════════╦════════════╦
║ ID ║ EMAIL ║ Total ║
╠══════════╬════════════╬════════════╬
║ 1 ║ 1@email.co ║ 4 ║
║ 3 ║ 3@email.co ║ 4 ║
╚══════════╩════════════╝════════════╝
答案 0 :(得分:-1)
我无法理解为什么你需要Count()?我想,根据你的问题(“选择所有类型3的经纪人”),它没有意义,或者我误解了什么?
修改强> 我通过临时表和变量在SQL SERVER中完成了它 如果你可以将它转换为mysql语法,我们的问题就解决了:
SELECT COUNT(*) as total, Email, [Type]
into #tbl3
from house
group by Email, Type
declare @a int
set @a = (select MAX(total) from #tbl3)
SELECT b.id, b.email, h.email, h.type, h.total
FROM brokers b
inner join
(
select * from #tbl3
where total=@a
) h
on h.Email=b.Email and h.Type=3
编辑:这是MySql语法,可以帮助您完成工作。
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (
SELECT COUNT(*) as total, Email, Type
from house
group by Email, Type
);
set @a = (select MAX(total) from table2);
SELECT b.id, b.email, h.email, h.type, h.total
FROM brokers b
inner join
(
select * from table2
where total=@a
) h
on h.Email=b.Email and h.Type=3
答案 1 :(得分:-1)
在不执行的情况下发布答案,希望这有效!
Select a.ID,a.Email,b.Cnt from Brokers as a
inner join (
Select Email,count(ID) as Cnt from Houses where Type =
(Select max(Type) from Houses)
group by Email
) as b on a.Email = b.Email