Mysql 选择字段中有2个以上非重复sql记录的位置

Mysql 选择字段中有2个以上非重复sql记录的位置,mysql,Mysql,这应该很容易,但我就是想不出这个 有一张有客户订单信息的桌子。此表中有一个名为customers\u email\u address和customers\u id的字段,以及许多其他非必需字段。我需要找到不同的记录,其中customers_email_address(客户电子邮件地址)字段中的条目不同,但对相同的客户id是唯一的。换句话说,我需要找出自其帐户成立以来,哪些客户更改了其帐户中的电子邮件地址,以便我可以使用他们的新电子邮件地址更新我的电子邮件广告计划。这是我在设计网站时没有想到的 例

这应该很容易,但我就是想不出这个

有一张有客户订单信息的桌子。此表中有一个名为customers\u email\u address和customers\u id的字段,以及许多其他非必需字段。我需要找到不同的记录,其中customers_email_address(客户电子邮件地址)字段中的条目不同,但对相同的客户id是唯一的。换句话说,我需要找出自其帐户成立以来,哪些客户更改了其帐户中的电子邮件地址,以便我可以使用他们的新电子邮件地址更新我的电子邮件广告计划。这是我在设计网站时没有想到的

例如:

customers_ID    customers_email_address
1               joeschome@hotmail.com
2               frankj@hotmail.com
1               joeschome@hotmail.com
2               frankj@hotmail.com
1               joeschome@yahoo.com
2               frankj@yahoo.com
3               janefr@live.com
3               janefr@live.com
3               janefr@live.com
查询结果应如下所示:

customers_id    customers_email_address
1               joeschome@hotmail.com
1               joeschome@yahoo.com
2               frankj@hotmail.com
2               frankj@yahoo.com
customers_id    customers_email_address1        customers_email_address2
1               joeschome@hotmail.com           joeschome@yahoo.com
2               frankj@hotmail.com      frankj@yahoo.com
仅当customers\u email\u address字段具有多个非重复记录但具有相同的customer\u id时返回

也许更好的办法是:

customers_id    customers_email_address
1               joeschome@hotmail.com
1               joeschome@yahoo.com
2               frankj@hotmail.com
2               frankj@yahoo.com
customers_id    customers_email_address1        customers_email_address2
1               joeschome@hotmail.com           joeschome@yahoo.com
2               frankj@hotmail.com      frankj@yahoo.com
我希望这是有道理的。如果你有更好的主意,请随时插话


无论如何,谢谢你们的帮助。

更新:你们可以这样做

SELECT DISTINCT o.customers_id, o.customers_email_address
  FROM orders o JOIN
(
  SELECT customers_id
    FROM orders
   GROUP BY customers_id
  HAVING COUNT(DISTINCT customers_email_address) > 1
) q
    ON o.customers_id = q.customers_id
 ORDER BY o.customers_id;
输出:

| CUSTOMERS_ID | CUSTOMERS_EMAIL_ADDRESS | |--------------|-------------------------| | 1 | joeschome@yahoo.com | | 1 | joeschome@hotmail.com | | 2 | frankj@yahoo.com | | 2 | frankj@hotmail.com | |客户| ID |客户|电子邮件|地址| |--------------|-------------------------| | 1 | joeschome@yahoo.com | | 1 | joeschome@hotmail.com | | 2 | frankj@yahoo.com | | 2 | frankj@hotmail.com |
这里是演示

这将返回两列customers\u email\u address1和customers\u email\u address2,而且速度很快,因为它可以使用覆盖索引

SELECT 
 orders1.customers_ID
, orders1.customers_email_address "customers_email_address1"
, orders2.customers_email_address "customers_email_address2"
FROM 
 orders orders1

INNER JOIN 
 orders orders2

ON
 orders1.customers_ID = orders2.customers_ID
AND
  orders1.customers_email_address != orders2.customers_email_address

GROUP BY
 orders1.customers_ID

; 

或者,如果您需要一个非规范化列表(从应用程序代码更新时可能很容易),您可以使用它,而且即使在大型表上也应该非常快,因为使用了覆盖索引

  SELECT
    customers_id
    , GROUP_CONCAT(DISTINCT customers_email_address SEPARATOR '|') as emails
   FROM orders
   GROUP BY customers_id 
   HAVING COUNT(DISTINCT customers_email_address) > 1

请参见

请显示您当前的查询和表结构。很快,我想你可能已经一针见血了,彼得!你真棒。谢谢行。看来得等几分钟。