我是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
答案 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
子句只获取一行值。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