我有两张桌子。票与票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';
任何帮助将不胜感激。
答案 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 )