Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在表列中存储SQL查询结果_Mysql_Sql_Calculated Columns - Fatal编程技术网

Mysql 如何在表列中存储SQL查询结果

Mysql 如何在表列中存储SQL查询结果,mysql,sql,calculated-columns,Mysql,Sql,Calculated Columns,我知道插入到表名查询中;然而,我不确定如何在这种情况下实现预期的结果 这里有一个稍微做作的例子来解释我在寻找什么,但恐怕我无法更成功地解释它 我在一个为酒店设计的数据库中有两张桌子 预订和客户预订 其中,预订包含主键房间号、房间类型等,客户预订包含FK房间号、FK客户id CUSTOMER\u BOOKING是一个链接表(许多客户可以进行许多预订,并且许多预订可以由许多客户组成) 最后,在应用程序后端中,我希望能够列出与他们关联的客户少于3个的所有房间。我可以执行一个单独的查询,并将结果保存在

我知道插入到表名查询中;然而,我不确定如何在这种情况下实现预期的结果

这里有一个稍微做作的例子来解释我在寻找什么,但恐怕我无法更成功地解释它

我在一个为酒店设计的数据库中有两张桌子

预订客户预订

其中,预订包含主键房间号、房间类型等,客户预订包含FK房间号、FK客户id

CUSTOMER\u BOOKING是一个链接表(许多客户可以进行许多预订,并且许多预订可以由许多客户组成)

最后,在应用程序后端中,我希望能够列出与他们关联的客户少于3个的所有房间。我可以执行一个单独的查询,并将结果保存在服务器端脚本中

然而,一个更优雅的解决方案(在我看来)是将其存储在预订表本身中。也就是说,添加一列no_of_bookings,该列统计当前PK_room_编号在CUSTOMER_BOOKING表中显示为外键FK_room_编号的次数。为什么要这样做呢?因为我不可能编写一个复杂的查询,既包括来自所有房间的信息,也包括其他表,还可以计算预订的发生率,而不排除没有任何预订的房间。一个酒店网站试图显示免费房间是一件非常糟糕的事情

看起来是这样的

预订:主卧房间号(104B)房间类型(双人)房间价格(高),无预订(3) 预订:主卧房间号(108C)房间类型(单人)房间价格(低),无预订(1) 客户预订:FK房间号(104B)FK客户id(4312) 客户预订:FK房间号(104B)FK客户id(6372) 客户预订:FK房间号(104B)FK客户id(1112) 客户预订:FK房间号(108C)FK客户id(9181)


如何创建此文件?

下面生成一个列表,显示所有预订,如果房间中每个房间都有客户,则标记为0或1。如果有多个客户,它将多次显示一些房间

选择预订。*, 案例CUSTOMER\u BOOKING.FK\u ROOM\u NUMBER为空,则0其他1结束为BOOKING\u标志 从预订离开外部加入客户预订 ON BOOKING.PK_room_numer=客户_BOOKING.FK_room_number

总结和分组我们得出:

选择预订。*, 总计(当CUSTOMER_BOOKING.FK_ROOM_NUMBER为空时,则为0,否则为1结束)作为预订计数 从预订离开外部加入客户预订 ON BOOKING.PK_room_number=客户_BOOKING.FK_room_number 按预订分组。主键\房间\号码

至少还有两个其他的解决方案,我可以在脑子里想出来

因为我不可能写一篇复杂的文章 查询,其中包括来自所有房间的信息 其他表,也计算预订的发生率,不包括 不包括没有预订的房间

我不会说这是不可能的,除非您遇到性能问题,否则它比添加新的摘要列更容易实现:

select b.*, count(cb.room_number) 
from bookings b
left join customer_booking cb on b.room_number = cb.room_number
group by b.room_number
根据您的查询,您可能需要使用包含每个房间预订计数的派生表

select b.*, coalesce(t1.number_of_bookings,0) number_of_bookings
from bookings b
left join (
    select room_number, count(*) number_of_bookings
    from customer_booking
    group by room_number
) t1 on t1.room_number = b.room_number
如果房间在派生表中没有任何条目(即0个预订),则必须
左键连接衍生表并选择
合并(t1.预订数量,0)


当您在每次计算预订量时遇到性能问题时,使用摘要栏是一个好主意。在这种情况下,我建议在
customer\u booking
表上创建
insert
delete
触发器,以增加或减少
number\u bookings
列。

您可以这样直接选择:

select DISTINCT 
       b1.room_pk,
       c1.no_of_bookings
  from cust_bookings b1,
       (select room_pk, count(1) as no_of_bookings
          from cust_bookings
         group by room_pk) c1
 where b1.room_pk = c1.room_pk 
 having c1.no_of_bookings < 3
选择DISTINCT
b1.U室pk,
c1.预订数量
从客户预订b1,
(选择房间主键,将(1)计为无预订)
从客户预订
按房间分组(主键)c1
其中b1.room_pk=c1.room_pk
c1.无预订数量<3

很抱歉,我使用了自己的表名来测试它,但您应该很容易地找到它。此外,“having”行仅用于限制返回到少于3次预订的房间的行。如果您删除该行,您将获得所有信息,并且如果您仍然希望执行该操作,则可以使用相同的sql更新bookings表中的一列。

考虑以下解决方案

一个简单的汇总查询,用于统计每次预订的客户数:

SELECT b.PK_room_number, Count(c.FK_customer_id) 
FROM Booking b
INNER JOIN Customer_Booking c ON b.PK_room_number = c.FK_room_number
GROUP BY b.PK_room_number
HAVING Count(c.FK_customer_id) < 3;  # ADD 3 ROOM MAX FILTER

插入到表1的值中(从表2中选择您的条件所在的需要字段)
为什么一个预订会有多个客户?预订不就是订单吗?如果我到达登记处,而另一位顾客拥有我的房间、飞机座位或租来的汽车,我就不会是一个快乐的露营者@毕竟,Parfait是人为设计的……请原谅我,MySQL方言倾向于不要求,所以第一个查询中的
b*
将在其他方言中失败,并且不遵循ANSI语法。@Parfait的观点很好。在其他数据库中,有必要按所有需要选择的列进行分组,这可能是一个好习惯。话虽如此,问题是用MySQL标记的,当组中的所有成员都相同时(我相信这里就是这种情况),那么就可以使用此功能了。@FuzzyTree Yes;更简单的解决方案是正确的方法。
UPDATE Booking b 
INNER JOIN 
  (SELECT b.PK_room_number, Count(c.FK_customer_id) As customercount
   FROM Booking b
   INNER JOIN Customer_Booking c ON b.PK_room_number = c.FK_room_number
   GROUP BY b.PK_room_number) As r
ON b.PK_room_number = r.PK_room_number
SET b.no_of_booking = r.customercount;