Mysql SQL,避免使用内部选择

Mysql SQL,避免使用内部选择,mysql,sql,Mysql,Sql,我正在制作一个事件应用程序,它允许人们一起创建具有名称、数量和价格的事件和票证类型,当用户购买票证时,将购买插入不同的表中,购买包括事件ID、票证类型ID和其他字段。在这一点上,我想获取我所有的票证类型,包括票证类型名称、数量、价格和可用票证 这是我桌子的图形外观 TicketTypeTable --------------------------------- |id |eventfk | name | qty | price| |-------------------------------

我正在制作一个事件应用程序,它允许人们一起创建具有名称、数量和价格的事件和票证类型,当用户购买票证时,将购买插入不同的表中,购买包括事件ID、票证类型ID和其他字段。在这一点上,我想获取我所有的票证类型,包括票证类型名称、数量、价格和可用票证

这是我桌子的图形外观

TicketTypeTable
---------------------------------
|id |eventfk | name | qty | price|
|--------------------------------|


TicketSalesTable
----------------------------------------------
|id |userfk |eventfk | ticketype | qty | price|
|---------------------------------------------|`
我想要的结果是

--------------------------------------------
|id |eventfk | name | qty |available | price|
|-------------------------------------------|
我可以通过一个内部选择来实现这一点,比如

但这对一个大型数据库来说是不好的……不管情况如何,这都是不好的

有人知道更好的出路吗

我也尝试过使用连接,但被卡住了


在s.eventfk=t.eventfk上选择t.id、t.eventfk、t.name、t.quantity、t.price从tickettypetable t左连接ticketsalestable s,其中t.eventfk=10

我想您需要一个包含ticketsalestable集合的连接,类似于

SELECT t.id, t.eventfk, t.name, t.quantity, t.price, (t.qty - s.sold) as available FROM tickettypetable t LEFT JOIN 
    ( select eventfk, tickettype, sum(qty) as sold from ticketsalestable group by eventfk, tickettype) s
    ON s.eventfk = t.eventfk and t.id = s.tickettype
 WHERE t.eventfk = 10
根据优化器的不同,也可以更快地将where条件添加到聚合中

SELECT t.id, t.eventfk, t.name, t.quantity, t.price, (t.qty - s.sold) as available FROM tickettypetable t LEFT JOIN 
    ( select eventfk, tickettype, sum(qty) as sold from ticketsalestable group by eventfk, tickettype where eventfk = 10) s
    ON s.eventfk = t.eventfk and t.id = s.tickettype
 WHERE t.eventfk = 10
编辑 ticketype也是连接标准

根据Turo的回答,我修改了它并提出了这个


选择t.id、t.name、t.quantity、IFt.price=0、'FREE',t.price、t.quantity-IFNULLs.salled、0(可从tickettypetb获得)t左连接选择sl.eventfk、sl.tickettypefk,COUNTsl.eventfk按sl.tickettypefk ORDER BY sl.tickettypefk DESC s ON s.tickettypefk=t.id和s.eventfk=t.eventfk从salestb sl GROUP出售,其中t.eventfk=22按t.id GROUP ORDER BY t.id DESC执行计划说明了什么?你试过加入吗?有什么区别吗?从ticketsalestable中选择count*在MyISAM引擎上非常快,即使记录中有数百万或数十亿条记录,因为行计数在.myd文件的头中。但在InnoDB上确实很慢。。如果可能的话,不确定如何加速缓存将是一个解决方案。@jarlh请参阅我的更新。我尝试了一个连接,但无法确定应该如何连接written@RaymondNijland你可能是对的,但是避免内心选择是一个很好的做法,因为我不知道你想要什么。没有名为available(可用)的列。这很好,但它汇总了某个活动售出的所有门票,而不考虑门票类型,并将总数放在第一行。其他行为空,因为总数您几乎没有写任何关于tickettype的内容,如何看待它?tickettype是TicketSalTable中ticketTypeTable的外键,它显示给定票证的售出数量。啊,那么SalesTable中的tickettype与type表中的id相对应?你应该提到那件事!哦,你提到了,但我没有马上明白
SELECT t.id, t.eventfk, t.name, t.quantity, t.price, (t.qty - s.sold) as available FROM tickettypetable t LEFT JOIN 
    ( select eventfk, tickettype, sum(qty) as sold from ticketsalestable group by eventfk, tickettype where eventfk = 10) s
    ON s.eventfk = t.eventfk and t.id = s.tickettype
 WHERE t.eventfk = 10