1

我有一个包含三个字段(item_id、source 和 price)的表。(item_id、source 和 price) 共同构成主键。

item_id    source      price
-------    -------     -----
1          paris       13
1          london      12
1          newyork     15
2          paris       22
2          london      15
2          newyork     14

对于每个 item_id,我想知道最便宜的获取地点,以及我将在该地点支付的价格。对于上面的示例,我希望看到以下输出:

item_id    source     price
-------    -------    ---------
1          london     12
2          newyork    14

有没有一种简单的方法可以做到这一点而无需两次提及表名?我正在使用 MySQL,所以我不能使用 WITH 子句。

我在另一个用户的问题中查看了joined two-query解决方案(组相关记录,但只从第一条记录中选择某些字段),但我真的很想避免两次提及该表。问题是这个问题中的简单表格实际上代表了我实际问题中的一个内联视图,每次使用大约需要 5 秒来创建,所以我希望找到替代方案。

4

2 回答 2

3

这是一种方法,使用内部连接过滤价格最低的行:

select i.* 
from items i
inner join (
    select item_id, min(price) as minprice
    from items 
    group by item_id
) cheapest on i.price = cheapest.minprice
    and i.item_id = cheapest.item_id

如果有多个最低价格的来源,它们都会出现。

编辑:由于您的问题提到项目视图需要很长时间才能建立,您可以将结果存储在临时表中。

create temporary table temp_items 
as 
select item_id, source, price from YourView

然后在临时表上运行分组查询。在 MySQL 中,临时表只对当前连接可见,并在连接关闭时自动删除。

于 2009-11-14T15:13:52.797 回答
0

不幸的是,我不知道 MySQL 数据和字符串转换。但是,如果您对正确的语法稍加修改,这可能会让您感到惊讶:

SELECT
   item_id,
   source = Convert(varchar(30), Substring(packed, 5, 30)),
   price = Convert(int, Substring(packed, 1, 4))
FROM
   (
      SELECT
         item_id,
         Min(Convert(binary(4), price) + Convert(varbinary(30), source) AS packed
      FROM items
      GROUP BY item_id
   ) X

这肯定是一个黑客。绝对不应该在所有情况下都使用它。但是,当性能至关重要时,有时它是值得的。

有关更多信息,请参阅此线程

于 2010-09-02T08:18:19.570 回答