我有一个名为orders的表,我跟踪成员的所有交易。此表记录了其registrationstatusid的所有更改。我需要找到将registrationstatusid从7更改为5的成员。 但我无法弄清楚如何编写查询。 这是我尝试过的:
select memberevents.memberid, orders.registrationstatusid
FROM orders
INNER JOIN memberevents ON orders.membereventid = memberevents.id
WHERE
memberevents.eventid = 2 AND
memberevents.deletedAt IS NULL AND
orders.registrationstatusid IN (5,7)
ORDER BY m.memberid, o.updatedAt
该查询会显示5和7的所有记录,但我只需要有5和7的成员。如果我尝试执行AND(orders.registrationstatusid = 5 AND orders.registrationstatusid = 7),则找不到任何记录。 有人可以帮帮我吗?
答案 0 :(得分:1)
这是“set-within-sets”查询的示例。您可以通过聚合解决此问题,并将逻辑放在having
子句中:
select memberevents.memberid
FROM orders INNER JOIN
memberevents
ON orders.membereventid = memberevents.id
WHERE memberevents.eventid = 2 AND
memberevents.deletedAt IS NULL
group by memberevents.memberid
having sum(orders.registrationstatusid = 5) > 0 and
sum(orders.registrationstatusid = 7) > 0;
唯一的警告:这显示了具有“5”和“7”值的成员。但是,它没有指定值的排序。
编辑:
您可以使用此字符串操作技巧找到排序:
select memberevents.memberid,
group_concat(orders.registrationstatusid) as statuses
FROM orders INNER JOIN
memberevents
ON orders.membereventid = memberevents.id
WHERE memberevents.eventid = 2 AND
memberevents.deletedAt IS NULL
group by memberevents.memberid
having concat(',', statuses, ',') like '%,7,5,%';
我意识到以下having
条款也有效:
having find_in_set(5, statuses) = find_in_set(7, statuses) + 1 and
find_in_set(7, statuses) > 0;