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