具有嵌套子查询的count()上的Groupwise-max

时间:2014-11-28 05:47:17

标签: mysql

当我试图将这个嵌套在我的头上时,我的脑袋正在变成糊状。

所以基本上我有两张桌子:

经纪人,这是我的“用户”表:

╔══════════╦════════════╦
║ 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得到:

  • 1个1型房屋。
  • 2个2型房屋。
  • 4个3型房屋。

Broker 2@email.co得到:

  • 2个类型为1的房屋
  • 2个2型房屋
  • 1栋3型房屋。

Broker 3@email.co得到:

  • 1栋1型房屋。
  • 3栋2型房屋。
  • 4个3型房屋。

由于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          ║
╚══════════╩════════════╝════════════╝

2 个答案:

答案 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