我正在寻找一种更改行对的两个值的列值的方法。
查找正确的行对是通过分组完成的。问题是由于分组,仅返回一个row_id。

案件:
培训师一天可以进行两次活动。
如果客户计划培训活动,则培训师会拜访该客户,因此他无法在第二次会议中拜访另一个客户。
计划培训活动的客户将获得所提供的活动,其位置的值为“空”或其客户ID。
这样,一位客户可以在一天中计划多个会话,而另一位客户在第一位客户在另一位客户时不能提出第二笔活动。
声明事件分为两个步骤:首先将状态更改为“待定”,事件获得到期日期,在下一步中,状态更改为“已接受”。
当待处理事件到期时,状态将更改回“打开”。

问题:无法始终清除该位置。如果发生或正在处理其他事件,则无法清除该位置。当两个事件均“打开”时,必须清除两个事件的位置。

设计:
事件表包含一个列的“位置”。
如果计划举办活动,则将当天的所有“位置”字段都设置为customerid;

eventid - orderid - eventdatetime - expiredate - status - location
2 - NULL - 12 december 2012  9:00 - NULL - open - 45
3 - 54   - 12 december 2012 13:00 - 23nov2012 - pending - 45
4 - 74   - 13 december 2012  9:00 - 23nov2012 - pending - 45
5 - 23   - 13 december 2012 13:00 - NULL - taken - 45
6 - NULL - 14 december 2012  9:00 - NULL - open - NULL
7 - NULL - 14 december 2012 13:00 - NULL - open - NULL


如果eventid 3过期,则必须将状态设置为“打开”,并且将eventid 2 AND 3的位置设置为NULL。
如果事件ID 4过期,则必须将状态设置为“打开”,但必须保持事件ID 4和5的位置不变。

我在两个查询中执行此操作:

查询一:

update trainingevents
set orderid = null
set expiredate = null
set status = "open"
where expiredate > now()


查询二:

update trainingevents
set location = null
set expiredate
where eventid in (
    select eventid from trainingevents
    where count(orderid)=0 and count(location)>0
    group by date_format(eventdatetime, only date)
)


我使用分组查找对,但是分组仅返回一个eventid。

有什么建议同时获取两个事件ID?

最佳答案

如果要更新两行,则无需分组(假设我正确理解了您)。

您可以这样重写查询二:

update trainingevents
set location = null
set expiredate = null
where eventid in (
    select eventid from trainingevents
    where orderid is null and location is not null
)


或者,更简单地说

update trainingevents
set
location = null,
expiredate = null
where orderid is null and location is not null

关于mysql - MySQL按日期和用户ID选择行对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13635962/

10-12 07:13