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

Posted

技术标签:

【中文标题】MySQL查找具有相同customerid且具有两个不同值的记录【英文标题】:MySQL find records with same customerid that have two different values 【发布时间】:2013-08-12 18:47:35 【问题描述】:

我有一个名为 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),它将找不到任何记录。 谁能帮帮我?

【问题讨论】:

请显示表架构 【参考方案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;

【讨论】:

以上是关于MySQL查找具有相同customerid且具有两个不同值的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中删除具有几个相同值的行?

在表中找到两条具有相同值的记录

MySQL GROUP BY ...具有不同的值相同的字段

CoreBluetooth 监控 100 个具有相同 UUID 且具有唯一输入的信标

按等级查找具有路径压缩且没有联合的集合

使用java在sql中查找具有相同数据的具有相同值的行?