如何创建复杂的嵌套选择视图?

时间:2015-09-17 07:10:42

标签: mysql sql view nested-queries

例如,这是一家餐厅的数据库,Type 1表示In-Restaurant,Type 2表示订单,Type 3表示Out-Restaurant。

我想创建一个视图来查看每个表的总金额。总金额是指(类型1)餐厅时间和(类型3)餐厅外时间之间的金额。有没有办法创造?

现有表格:

Table_No|Type   |Amount     |Time
1       |1      |NULL       |2015-9-17 01:40
1       |2      |5.0        |2015-9-17 01:42
2       |1      |NULL       |2015-9-17 01:43
2       |2      |4.0        |2015-9-17 01:48
1       |2      |5.5        |2015-9-17 01:51
1       |2      |4.0        |2015-9-17 01:52
1       |3      |NULL       |2015-9-17 01:53
2       |2      |3.0        |2015-9-17 01:58
2       |3      |NULL       |2015-9-17 02:00
1       |1      |NULL       |2015-9-17 02:02
1       |2      |4.5        |2015-9-17 02:05
1       |3      |NULL       |2015-9-17 02:10

预期结果:

Table_No|Count  |Total_Amount   |Time
1       |3      |14.5           |2015-9-17 01:40
2       |2      |7.0            |2015-9-17 01:43
1       |1      |4.5            |2015-9-17 02:02

1 个答案:

答案 0 :(得分:0)

这是一个复杂的查询,因此我不打算发布整个查询。您需要做的是识别到达的每位客人,这是Table_No, Type=1, Time的唯一组合。所以你需要像这样的子查询。

SELECT Table_No, Time
FROM restaurant_table
WHERE Type = 1

对于每位客人,您需要在表格中获取相应的订单行。也就是说,一个或多个类型= 2行。当然,对于单个表,有许多" type-2",属于其他客户。因此,对于每个到达的客户,您还需要下一个客户到达同一个表的到达时间。您可以通过将每个到达的客户与同一桌子的所有其他到达客户进行比较来计算出这一点,并为所有min(Time)选择Time_othter_customer > Time_current_costomer。让我们从上面Arrival

调用视图
SELECT My.Table_No AS Table_No,
       My.Time AS Arrival_Time,
       min(Other.Time) AS Arrival_Next_Customer
FROM Arrival AS My, Arrival AS Other
WHERE My.Table_No = Other.Table_No
      AND Other.Time > My.Time
GROUP BY My.Table_No, My.Time

(注意,对于每个表的最后一个客户,此处不会产生任何结果,因为之后到达的同一个表没有其他自定义。)

因此,您还需要分别为每个表识别每个最后一个客户。

SELECT Table_No, max(Time) AS Arrival_Time
FROM Arrival
GROUP BY Table_No

(注意,两个查询都没有任何重叠结果。)

现在你可以选择" type-2"每个到达客户的条目。让我们调用ArrivalNextArrivalLast

上方的观点
SELECT Arrival.Table_No,
       Arrival.Time,
       restaurant_table.Type
       restaurant_table.Amount
FROM ArrivalNext, ArrivalLast, restaurant_table
WHERE (ArrivalNext.Table_No = restaurant_table.Table_No
      AND restaurant_table.Time BETWEEN ArrivalNext.Arrival_Time AND ArrivalNext.Arrival_Next_Customer)
      OR
      (ArrivalLast.Table_No = restaurant_table.Table_No
      AND restaurant_table.Time > ArrivalLast.Arrival_Time)
      AND restaurant_table.Type = 2

连接谓词很棘手。如果ArrivalNext中有一行,则订单的时间必须介于客户的到达时间和下一个客户(同一个表)的到达时间之间,因为其他客户的订单可能不同也是。对于这种情况,我们知道ArrivalLast中没有条目。另一方面,如果客户是表的最后一个,则ArrivalNext中没有条目,但ArrivalLast中没有条目,因此订单时间必须大于到达时间,因为所有订单由于最后一位客户的到达时间属于最后一位客户,因此时间戳较大。

现在你可以计算" type-2"条目和总和您的订单金额。让我们调用Customers上方的视图:

SELECT Table_No
       count(*) AS Count
       sum(Amount) AS Total_Amount
       Time
FROM Customers
WHERE Type = 2
GROUP BY Table_No, Time

当然,你现在需要把它们放在一起......(我希望我做对了;至少它应该有助于推导出正确的解决方案。)