SQL Distinct子句不起作用?

时间:2016-11-28 16:16:59

标签: mysql sql database select distinct

我是SQL的新手,很抱歉,如果这是我愚蠢的话!

我正在尝试选择名称不会出现多次的几列,但是由于某些原因,使用distinct子句不会这样做吗?

这是我的问题:

SELECT DISTINCT A.fldContactName, A.fldsignonlinesetup, B.fldorderdate, A.fldemail
FROM tblcustomers AS A
LEFT JOIN tblorders AS B ON A.fldcustomerid = B.fldcustomerid
WHERE B.fldorderdate BETWEEN '2013-01-01' AND '2016-12-31'
AND A.fldemail <> 'NULL' AND A.fldcontactname <> 'NULL' AND A.fldcontactname <> '' 
AND A.fldemail <> ''
AND A.fldsignonlinesetup = 0
ORDER BY A.fldcontactname ASC

如何让它只显示独特的记录,例如联系人姓名John Smith只出现一次?

预期结果:

fldContactName:    fldEmail:        fldSignOnlineSetup:    fldOrderDate:
James Smith        Email1@gmail.com         0              2016-08-14
Bill Plant         Email2@gmail.com         0              2015-02-24

实际结果:

fldContactName:    fldEmail:        fldSignOnlineSetup:    fldOrderDate:
James Smith        Email1@gmail.com         0              2016-08-14
Bill Plant         Email2@gmail.com         0              2015-02-24
James Smith        Email1@gmail.com         0              2014-06-20

2 个答案:

答案 0 :(得分:1)

如果您希望命名仅出现一次,则会想到group by。一种方法是:

SELECT c.fldContactName,
       MAX(c.fldsignonlinesetup) as fldsignonlinesetup,
       MAX(c.fldorderdate) as fldorderdate,
       MAX(c.fldemail) as fldemail
FROM tblcustomers c LEFT JOIN
     tblorders o
     ON c.fldcustomerid = o.fldcustomerid
WHERE o.fldorderdate BETWEEN '2013-01-01' AND '2016-12-31' AND
      c.fldemail <> 'NULL' AND c.fldcontactname <> 'NULL' AND 
      c.fldcontactname <> '' AND c.fldemail <> '' AND
      c.fldsignonlinesetup = 0
GROUP BY c.fldcontactname
HAVING COUNT(*) = 1
ORDER BY c.fldcontactname ASC;

SELECT DISTINCT只是确保 all 结果集中的列永远不会重复。它与仅查找一行的值无关。 HAVING子句执行此操作。

注意:

  • 表别名的使用很好,但表名的缩写使查询更容易理解。
  • MAX()实际上是无操作。如果有一行,则返回一行中的值。
  • GROUP BY位于您关注的字段上 - 您不想复制的字段。
  • HAVING子句只获取一行值。
  • MySQL不需要MAX()函数,但我强烈建议使用聚合函数,因此您不会学习在其他数据库中不起作用并且在MySQL中可能出现意外行为的坏习惯。
  • 您的意思是fldemail <> 'NULL'还是打算A.fldemail IS NOT NULL

答案 1 :(得分:0)

您是仅要显示所选数据一次还是仅获取数据库中唯一的数据?

对于后者呢

SELECT A.fldContactName, A.fldsignonlinesetup, B.fldorderdate, A.fldemail
FROM tblcustomers AS A
LEFT JOIN tblorders AS B ON A.fldcustomerid = B.fldcustomerid
WHERE B.fldorderdate BETWEEN '2013-01-01' AND '2016-12-31'
AND A.fldemail not in ('NULL', '') 
AND A.fldcontactname not in ('NULL', '')
AND A.fldsignonlinesetup = 0
GROUP BY A.fldContactName, A.fldsignonlinesetup, B.fldorderdate, A.fldemail
HAVING count(*) = 1
ORDER BY A.fldcontactname ASC