2

鉴于下表,我试图从 carCode 列中选择具有唯一电子邮件地址的所有条目。对此的 SQL 选择语句是什么?我尝试了以下方法,但它似乎不起作用:

SELECT DISTINCT carCode, emailAddress, COUNT( * ) AS count
FROM myTable
WHERE (
carCode != ''
)
GROUP BY carCode;

这是表格列:

ID | carCode | emailAddress | fName | lName

并给出以下示例:

1 | cc001 | a@b.com | fname1| lname1
2 | cc001 | a@b.com | fname2 | lname2
3 | cc001 | b@b.com | fname3 | lname3
4 | cc001 | c@b.com | fname4 | lname4

应该只返回第 1、3 和 4 行或第 2、3 和 4 行,因为 1 和 2 具有相同的代码和电子邮件地址。

请指教。

PS 澄清一下,我正在尝试计算所有汽车代码的实例,但如果为相同的汽车代码找到重复的电子邮件地址,则只计算该电子邮件地址一次。这是否阐明了我想要实现的目标?

4

6 回答 6

1

您需要一个having子句来消除第 1 行(它有重复项):

SELECT carCode, emailAddress, 1 as cnt
FROM myTable
WHERE carCode != ''
GROUP BY carCode, emailaddress;
having count(*) = 1

对于您修改后的问题,答案只是一组:

SELECT carCode, emailAddress, count(*) as cnt
FROM myTable
WHERE carCode != ''
GROUP BY carCode, emailaddress;
于 2013-01-23T18:27:21.937 回答
0

尝试这个

SELECT DISTINCT  emailAddress, carCode,  COUNT( * ) AS count
FROM myTable
WHERE (
carCode != ''
)
GROUP BY carCode;

干杯:)

于 2013-01-23T18:27:42.827 回答
0

将 emailAddress 添加到 GROUP BY,删除 DISTINCT:

SELECT carCode, emailAddress, COUNT( * ) AS count
FROM myTable
WHERE carCode != ''
GROUP BY carCode, emailAddress;
于 2013-01-23T18:27:51.243 回答
0

您实际上根本不需要DISTINCT这里,如果您想获取每个不同的汽车代码和电子邮件地址组合的记录数,您只需要按 carCode 和 emailAddress 进行分组。

SELECT carCode, emailAddress, count(ID) as `count`
FROM myTable
WHERE carCode <> ''
GROUP BY carCode, emailAddress
于 2013-01-23T18:28:21.483 回答
0

尝试这个...

SELECT  carCode, emailAddress, count(*) AS count
FROM myTable
WHERE carCode != ''
GROUP BY carCode, emailAddress
于 2013-01-23T18:26:22.517 回答
0

一种简单的方法是使用LEFT JOIN; 只返回所有没有具有较低 ID 和相同代码/电子邮件的行的行;

SELECT * 
FROM myTable a
LEFT JOIN myTable b
  ON a.emailAddress = b.emailAddress
 AND a.carCode = b.carCode
 AND a.ID > b.id
WHERE b.id IS NULL

用于测试的 SQLfiddle

这种方法的优点是您可以获得结果的完整行,如果您真的只需要代码和电子邮件,您应该使用GROUP BY许多其他答案的建议。

于 2013-01-23T18:35:40.837 回答