【问题标题】:run similar query with different params使用不同的参数运行类似的查询
【发布时间】:2017-03-20 22:37:08
【问题描述】:

我有订单和行表。

一个订单可以有一行或多行。
一行引用product(购买的产品),date_at(可以想到一张票。可以使用这张票的日期)

create table o (
 id integer NOT NULL
);


CREATE TABLE line (
    id integer NOT NULL,
    order_id integer NOT NULL,
    product_id integer NOT NULL,
    date_at date
  );

我正在寻找每个日期有多少bookings/reservations。 我可以获取每个日期的(date_at, count) 列表

select date(t3.date_at), count(*)
from (
    select t1.id, date(t2.date_at) as date_at, count(*)
    from o t1
        inner join line t2 on t1.id = t2.order_id
    group by t1.id, date(t2.date_at)) t3
group by date(t3.date_at);

现在我想要每个产品的结果。

即我想为每个 product_id 获取包含该产品的订单的 (date, count) 列表(至少一行包含 product_id 的订单)。

我可以使用不同的{product_id} 在循环中运行以下查询,但我想可能有更好的方法

select date(t3.date_at), count(*)
from (
    select t1.id, date(t2.date_at) as date_at, count(*)
    from o t1
        inner join line t2 on t1.id = t2.order_id
    where t2.product_id={product_id}
    group by t1.id, date(t2.date_at)) t3
group by date(t3.date_at);

我正在使用 postgres。

【问题讨论】:

  • 为什么要将订单日期放在line 表中?并且,用您正在使用的数据库标记您的问题。
  • 您不应按订单 ID 分组以获取每个日期的订单数
  • @GordonLinoff 我编辑了操作,不是订单日期,而是与产品相关的日期。
  • @McNets: postgres

标签: sql postgresql


【解决方案1】:

您的查询似乎太复杂了。我认为这可以满足您的要求:

select product_id, date(date_at), count(*) as cnt
from line l
group by product_id, date(date_at)
order by product_id, date(date_at);

如果一个产品可以出现在一个订单中的多行,那么使用:

select product_id, date(date_at), count(distinct order_id) as cnt
from line l
group by product_id, date(date_at)
order by product_id, date(date_at);

你甚至不需要joinorders。不过,我要指出的是,将日期放在 orders 中(对我而言)比在 lines 中更有意义。

【讨论】:

  • 我的错,我不得不解释 date_at 的含义。我编辑了操作来解释它。这是产品的属性而不是订单的属性。 date_at 指定您可以使用产品的日期。这是reserved date
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2012-03-23
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多