Mysql 选择字段中有2个以上非重复sql记录的位置
这应该很容易,但我就是想不出这个 有一张有客户订单信息的桌子。此表中有一个名为customers\u email\u address和customers\u id的字段,以及许多其他非必需字段。我需要找到不同的记录,其中customers_email_address(客户电子邮件地址)字段中的条目不同,但对相同的客户id是唯一的。换句话说,我需要找出自其帐户成立以来,哪些客户更改了其帐户中的电子邮件地址,以便我可以使用他们的新电子邮件地址更新我的电子邮件广告计划。这是我在设计网站时没有想到的 例如:Mysql 选择字段中有2个以上非重复sql记录的位置,mysql,Mysql,这应该很容易,但我就是想不出这个 有一张有客户订单信息的桌子。此表中有一个名为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
请参见请显示您当前的查询和表结构。很快,我想你可能已经一针见血了,彼得!你真棒。谢谢行。看来得等几分钟。