2016-11-28 22 views
2

我是SQL新手,很抱歉,如果这是我的愚蠢!SQL区别子句不起作用?

我想选择其中的名字没有出现一次以上几列,但使用不同的条款因某种原因不这样做呢?

这里是我的查询:

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 

我如何得到它,只显示的记录是唯一例如联系人姓名约翰史密斯只出现一次?

预期结果:

fldContactName: fldEmail:  fldSignOnlineSetup: fldOrderDate: 
James Smith  [email protected]   0    2016-08-14 
Bill Plant   [email protected]   0    2015-02-24 

实际结果:

fldContactName: fldEmail:  fldSignOnlineSetup: fldOrderDate: 
James Smith  [email protected]   0    2016-08-14 
Bill Plant   [email protected]   0    2015-02-24 
James Smith  [email protected]   0    2014-06-20 
+1

提供样本数据和预期结果。 – Viki888

+2

你真的是指'fldemail <>'NULL''或你打算'A.fldemail IS NOT NULL'吗?您的版本是一个字符串与四个字母的字符串比较。第二个检查值不是“NULL”。 –

+0

独特之处在于所有领域都不一样。如果你想每个名字只有一个记录出现,那么你必须知道允许排除相关记录的业务规则,或者你需要将相关记录的值连接成一个字段,因为peopel可能有多个订单,所以不太可能您将永远只有一行代名并满足您的业务规则,除非他们只需要第一个订单或最近的订单。 – HLGEM

回答

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只是确保在所有结果集中的列是永远不会重复。它与查找只有一行的值无关。 HAVING子句执行此操作。

注:

  • 使用表的别名是好的,但对表名的缩写使查询更容易理解。
  • MAX()真的是一个无操作。用一行,它从一行返回值。
  • GROUP BY在你关心的领域 - 你不想复制的领域。
  • HAVING条款得到的值只有一行。
  • 的MySQL不需要MAX()功能,但我强烈建议您使用聚合功能,这样你就不会学坏习惯,不以其他数据库,并且可以在MySQL的表现出乎意料。
  • 你真的是指fldemail <> 'NULL'还是你打算A.fldemail IS NOT NULL
+1

注意OP,这可能会也可能不会给你你需要的东西。这实际上取决于您的业务规则,只有您的特定业务才能定义。 – HLGEM

+0

然而,感谢您的帮助,当运行此查询它说,有一个无效的列名'fldorderdate'? –

+0

可能需要在'SELECT'列表中'o.fldorderdate'而不是'c.' –

0

你想一次显示您所选择的数据或获取这是唯一在DB独特的数据?

对于后者做

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