简体   繁体   English

MySQL查找具有相同customerid且具有两个不同值的记录

[英]MySQL find records with same customerid that have two different values

I have a table called orders where I track all transactions by members. 我有一个名为orders的表,我跟踪成员的所有交易。 This table keeps track of all changes to their registrationstatusid. 此表记录了其registrationstatusid的所有更改。 I need to find members who changed their registrationstatusid from 7 to 5. But I can't figure out how to write the query. 我需要找到将registrationstatusid从7更改为5的成员。但我无法弄清楚如何编写查询。 Here's what I've tried: 这是我尝试过的:

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

That query brings up all records with 5 and 7, but I need just the members who have 5 and 7. If I try to do AND (orders.registrationstatusid = 5 AND orders.registrationstatusid = 7) it finds no records. 该查询会显示5和7的所有记录,但我只需要有5和7的成员。如果我尝试执行AND(orders.registrationstatusid = 5 AND orders.registrationstatusid = 7),则找不到任何记录。 Can anyone help me please? 有人可以帮我吗?

This is an example of a "set-within-sets" query. 这是“set-within-sets”查询的示例。 You can solve this with aggregation and putting the logic in the having clause: 您可以通过聚合解决此问题并将逻辑放在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;

The only caveat: this shows members who have values of both "5" and "7". 唯一的警告:这显示了具有“5”和“7”值的成员。 However, it does not specify the ordering of the values. 但是,它没有指定值的顺序。

EDIT: 编辑:

You can find the ordering using this string manipulation trick: 您可以使用此字符串操作技巧找到排序:

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,%';

I realize that the following having clause also works: 我意识到以下having子句也有效:

having find_in_set(5, statuses) = find_in_set(7, statuses) + 1 and
       find_in_set(7, statuses) > 0;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM