根据该项目的计数确定值

时间:2010-07-03 17:59:46

标签: mysql

我有两张桌子。票与票ticketlist。 如果该项目已售罄,则票证表中的售罄列必须为1。 当表单票据列表中该项目的计数为2时,表格票证需要售罄。

ticket
ticketid, quantity, soldout  
21          2             1 

ticketlist
ticketlistid, ticketid          
3                 21
4                 21

逻辑是:

如果ticket.quantity - (COUNT(ticketlist.ticketlistid)WHERE ticket.ticketid = ticketlist.ticketlistid)>

soldout应为'1'。 0

这是我试过的MySQL

   UPDATE ticket
    SET soldout = '1'
    WHERE quantity - (SELECT ticket.ticketid, COUNT(ticketlist.ticketlistid)
            FROM ticket, ticketlist
            WHERE ticket.ticketid = ticketlist.ticketid) > '0';

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

在您的子选择中:

  • 您应该只返回一列。
  • 请勿从更新中选择相同的表格。

您可能还希望在sold_out时将quantity - (SELECT ...) <= 0设置为1,而不是像当前那样将> 0设置为。

将查询更改为:

UPDATE ticket
SET soldout = '1'
WHERE quantity - (
    SELECT COUNT(ticketlist.ticketlistid)
    FROM ticketlist
    WHERE ticket.ticketid = ticketlist.ticketid
) > 0;

您的数据库也是非规范化的。您将信息存储在一个表中,该表可以从另一个表中的数据派生。如果两者不同步,这种冗余可能会导致错误。如果出于性能原因需要,我建议只执行此操作。

答案 1 :(得分:2)

你最好implementing this as a view,否则可能会导致售完号码不同步。

CREATE VIEW vw_tickets AS
    SELECT t.ticketid,
           t.quantity,
           COUNT(*) AS sold,
           CASE 
             WHEN t.quantity = COUNT(*) THEN 1 
             WHEN t.quantity < COUNT(*) THEN -1 -- oversold
             ELSE 0 
           END AS soldout
      FROM TICKET t
 LEFT JOIN TICKETLIST tl ON tl.ticketid = t.ticketid
  GROUP BY t.ticketid, t.quantity

答案 2 :(得分:1)

我看到的一个问题是:

(SELECT ticket.ticketid, COUNT(ticketlist.ticketlistid)
            FROM ticket, ticketlist
            WHERE ticket.ticketid = ticketlist.ticketid) 

您正在针对"> 0"测试该查询的结果,但是它会返回ticketid和count。你需要删除ticket.ticketid。

答案 3 :(得分:1)

试试这个:

UPDATE `ticket`
SET `soldout` = 1
WHERE `ticketid` IN ( 
    SELECT `ticketid` FROM `ticketlist` GROUP BY `ticketid` HAVING COUNT(`ticketlistid`) = 2 )