似乎无法使查询结果唯一
Can't seem to make the results of query to be unique
我的问题是我只需要在每杯饮料中做以下陈述 (a.DRINK) once/unique 但我似乎做不到。
create table LOWEST as
select a.DRINK, min(b.PRICE), c.STREET, c.BLDG_NO
from ALLDRINKS a
left join SERVES b on a.DRINK = b.DRINK
left join LOCATED c on b.PUB = c.PUB
group by a.DRINK, c.STREET, c.BLDG_NO
我得到的当前结果
------------------------------------------------
| DRINK |min(b.PRICE)| STREET | BLDG_NO |
| VODKA | 7.10 | FAKE ST. | 123 |
| VODKA | 4.50 | OAK Ave. | 13 |
| VODKA | 8.30 | Rail RD. | 11 |
| RUM | 6.30 | Cherry RD. | 131 |
| RUM | 10.30 | TEST Pl. | 21 |
------------------------------------------------
我期待的地方:
------------------------------------------------
| DRINK |min(b.PRICE)| STREET | BLDG_NO |
| VODKA | 4.50 | OAK Ave. | 13 |
| RUM | 6.30 | Cherry RD. | 131 |
------------------------------------------------
如果您还可以解释需要完成的工作背后的逻辑,那将对以后非常有帮助!先感谢您!
-使用 MYSQL Workbench 8.0
可以在tableSERVES
中使用row_number()
window函数得到每个DRINK
的最低价,所以不需要group by
:
create table LOWEST as
select a.DRINK, b.PRICE, c.STREET, c.BLDG_NO
from ALLDRINKS a
left join (
select t.*
from (
select *, row_number() over (partition by DRINK order by price) rn
from SERVES
) t
where t.rn = 1
) b on a.DRINK = b.DRINK
left join LOCATED c on b.PUB = c.PUB
您想要 serves
中具有每个 drink
最低价格的行,以及对应的 location
。如果是这样你不应该考虑聚合,而是过滤.
您可以在 left join
:
中使用相关子查询进行过滤
create table lowest as
select d.drink, s.price, c.street, l.bldg_no
from alldrinks d
left join serves s
on s.drink = d.drink
and s.price = (select min(s1.price) from serves s1 where s1.drink = s.drink)
left join located l
on l.pub = s.pub
请注意,我重命名了您的 table 别名,因此它们更有意义,这使查询更容易理解。
我的问题是我只需要在每杯饮料中做以下陈述 (a.DRINK) once/unique 但我似乎做不到。
create table LOWEST as
select a.DRINK, min(b.PRICE), c.STREET, c.BLDG_NO
from ALLDRINKS a
left join SERVES b on a.DRINK = b.DRINK
left join LOCATED c on b.PUB = c.PUB
group by a.DRINK, c.STREET, c.BLDG_NO
我得到的当前结果
------------------------------------------------
| DRINK |min(b.PRICE)| STREET | BLDG_NO |
| VODKA | 7.10 | FAKE ST. | 123 |
| VODKA | 4.50 | OAK Ave. | 13 |
| VODKA | 8.30 | Rail RD. | 11 |
| RUM | 6.30 | Cherry RD. | 131 |
| RUM | 10.30 | TEST Pl. | 21 |
------------------------------------------------
我期待的地方:
------------------------------------------------
| DRINK |min(b.PRICE)| STREET | BLDG_NO |
| VODKA | 4.50 | OAK Ave. | 13 |
| RUM | 6.30 | Cherry RD. | 131 |
------------------------------------------------
如果您还可以解释需要完成的工作背后的逻辑,那将对以后非常有帮助!先感谢您! -使用 MYSQL Workbench 8.0
可以在tableSERVES
中使用row_number()
window函数得到每个DRINK
的最低价,所以不需要group by
:
create table LOWEST as
select a.DRINK, b.PRICE, c.STREET, c.BLDG_NO
from ALLDRINKS a
left join (
select t.*
from (
select *, row_number() over (partition by DRINK order by price) rn
from SERVES
) t
where t.rn = 1
) b on a.DRINK = b.DRINK
left join LOCATED c on b.PUB = c.PUB
您想要 serves
中具有每个 drink
最低价格的行,以及对应的 location
。如果是这样你不应该考虑聚合,而是过滤.
您可以在 left join
:
create table lowest as
select d.drink, s.price, c.street, l.bldg_no
from alldrinks d
left join serves s
on s.drink = d.drink
and s.price = (select min(s1.price) from serves s1 where s1.drink = s.drink)
left join located l
on l.pub = s.pub
请注意,我重命名了您的 table 别名,因此它们更有意义,这使查询更容易理解。