2010-08-15 119 views
0

我的查询:SQL GROUP BY和NULL值:如何将结果按非空值分组?

SELECT *, 
    contacts.createdAt AS contactcreatedAt, 
    contacts.updatedAt AS contactupdatedAt, 
    bidresponses.itemid AS bidresponseitemid, 
    bidresponses.personid AS bidresponsepersonid, 
    SUM(tagsitems.quantity) AS totalquantity 
FROM items 
LEFT OUTER JOIN tagsitems ON items.id = tagsitems.itemid 
LEFT OUTER JOIN itemscontacts ON items.id = itemscontacts.itemid 
LEFT OUTER JOIN contacts ON itemscontacts.contactid = contacts.id 
LEFT OUTER JOIN bidresponses ON items.id = bidresponses.itemid AND itemscontacts.personid = bidresponses.personid 
LEFT OUTER JOIN bidtemplatefields ON bidresponses.bidtemplatefieldid = bidtemplatefields.id 
WHERE ((items.id = 70687 OR items.id = 70595) AND itemscontacts.relationship = 's') AND (items.deletedAt IS NULL) 
GROUP BY items.id, tagsitems.itemid, bidresponses.personid, bidresponses.bidtemplatefieldid 
ORDER BY items.id ASC 

没有SUM()GROUP BY子句该查询返回了预期的效果,减去重要totalquantity值。

目前困扰我的任务是构造GROUP BY子句,以便它“忽略”NULL或缺少来自bidresponses的值。数据是这样的,结果将是一组混合的项目 - 有些在投标响应表中有条目,有些则没有。

编辑: 我希望在bidresponses表中显示空值的条目。使用当前的GROUP BY子句,它们不是。 我应该注意到,我使用分组的唯一原因是我可以得到总数量值。下面是查询输出的一个例子,而不的SUM()和GROUP BY子句:

+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------------------+---------------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+ 
| id | itemtypeid | code | description    | cost | unittypeid | projectid | companyid | createdAt   | updatedAt   | deletedAt | unittype | tagid | itemid | quantity | itemid | contactid | personid | sentdate   | responsedate | bidtemplateid | relationship | awarddate | assigndate | id | companyid | personid | companyidOwner | parentContactid | createdAt   | updatedAt   | firstName | lastName | company    | email    | bidtemplatefieldid | itemid | bidresponse | personid | id | bidtemplatefield | fieldtypeid | contactcreatedAt | contactupdatedAt | bidresponseitemid | bidresponsepersonid | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------------------+---------------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+ 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf     | [email protected]  |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL | 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  22 | 34794 | 2010-08-14 18:44:02 |   NULL |    1 | s   |  NULL |  NULL | 22 |  NULL | 34794 |    1 |   NULL | 2010-08-09 19:56:28 | 2010-08-10 13:55:03 | NULL  | NULL  | anewwwww   | [email protected]   |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-09 19:56:28 | 2010-08-10 13:55:03 |    NULL |    NULL | 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  27 | 34797 | 2010-08-14 22:36:59 |   NULL |    1 | s   |  NULL |  NULL | 27 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:11:52 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:11:52 | NULL    |    NULL |    NULL | 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  28 | 34798 | 2010-08-14 22:37:00 |   NULL |    1 | s   |  NULL |  NULL | 28 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:18:27 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:18:27 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf     | [email protected]  |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  |  2 | 70687 |  NULL | 70687 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf     | [email protected]  |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  27 | 34797 | 2010-08-14 22:36:59 |   NULL |    1 | s   |  NULL |  NULL | 27 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:11:52 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:11:52 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  |  2 | 70687 |  NULL | 70687 |  27 | 34797 | 2010-08-14 22:36:59 |   NULL |    1 | s   |  NULL |  NULL | 27 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:11:52 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:11:52 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  28 | 34798 | 2010-08-14 22:37:00 |   NULL |    1 | s   |  NULL |  NULL | 28 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:18:27 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:18:27 | NULL    |    NULL |    NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  |  2 | 70687 |  NULL | 70687 |  28 | 34798 | 2010-08-14 22:37:00 |   NULL |    1 | s   |  NULL |  NULL | 28 |  NULL |  NULL |    1 |   NULL | 2010-08-10 19:18:27 | NULL    | NULL  | NULL  | [email protected] | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-10 19:18:27 | NULL    |    NULL |    NULL | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------------------+---------------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+ 

这里是查询输出一个例子的SUM()和GROUP BY子句:

+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------+----------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+---------------+ 
| id | itemtypeid | code | description    | cost | unittypeid | projectid | companyid | createdAt   | updatedAt   | deletedAt | unittype | tagid | itemid | quantity | itemid | contactid | personid | sentdate   | responsedate | bidtemplateid | relationship | awarddate | assigndate | id | companyid | personid | companyidOwner | parentContactid | createdAt   | updatedAt   | firstName | lastName | company | email   | bidtemplatefieldid | itemid | bidresponse | personid | id | bidtemplatefield | fieldtypeid | contactcreatedAt | contactupdatedAt | bidresponseitemid | bidresponsepersonid | totalquantity | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------+----------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+---------------+ 
| 70595 |   1 | NULL | HD Banners    | NULL |  NULL |   7 |   1 | 2010-05-10 17:00:11 | 2010-08-14 18:57:41 | NULL  | each  | NULL | NULL |  NULL | 70595 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf  | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL |   NULL | 
| 70687 |   1 | NULL | Editing and adding labels | NULL |  NULL |   7 |   1 | 2010-05-15 07:26:33 | 2010-08-14 18:55:48 | NULL  | each  | 12 | 70687 |  NULL | 70687 |  16 | 34789 | 2010-08-14 22:37:01 |   NULL |    1 | s   |  NULL |  NULL | 16 |  NULL |  NULL |    1 |   NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 | NULL  | NULL  | sdf  | [email protected] |    NULL | NULL | NULL  |  NULL | NULL | NULL    |  NULL | 2010-08-05 18:40:01 | 2010-08-05 18:41:40 |    NULL |    NULL |   NULL | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------+----------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+---------------+ 
+0

我不确定我是否完全理解你。您希望'bidresponseitemid'和'bidresponsepersonid'列中值为NULL的结果行不显示?或者他们没有出现,你想要他们? 也许包含一个示例结果集(通过在控制台/终端中使用mysql命令,您可以获得很好的文本结果)并描述您想要改变的内容。 “WHERE'bidresponsepersonid'不是NULL”可能是你要找的东西。 – Thomas 2010-08-15 07:30:36

+0

谢谢托马斯。我会在上面澄清。 – 2010-08-15 07:31:35

回答

1

您需要在GROUP BY子句中包含所有重要的非聚合列。现在,你没有通过createdAt等进行分组。

0

如果你需要所有那些行SUM()和因此所需的GROUP BY将不是一个好的解决方案。

最好的解决方案可能是在处理/循环客户端代码/脚本中的所有行时添加数量。

另外,您可以用GROUP BYSUM()查询两次,一次以获得每个items.id然而,即使做了额外的循环,通过在客户端代码中的所有行的数量可能比查询快一倍,也可能取决于大小的结果。

+0

你是对的,我可以做客户端处理,但我只是觉得必须有一个更简单的方法...如果只有我可以对GROUP子句应用某种WHERE规则... – 2010-08-15 08:02:43

+0

“GROUP BY”会按照您告诉的方式合并您的行。使用'GROUP BY items.id'你总是会得到该行的id。我不知道有一个功能可以完成你想要的功能。如果你想用SQL来完成,你总是可以发送2个查询,例如:'SELECT SUM(tagsitems.quantity)AS totalquantity,tagsitems.itemid FROM tagsitems GROUP BY tagitems.itemid'和另一个。顺便说一句:不要使用*,除非你真的使用100%。 – Thomas 2010-08-15 08:23:24

+0

事实证明,只是简单地将group by子句中的3rd字段更改为itemscontacts.personid而不是bidresponses.personid,这正是我所需要的! – 2010-08-16 00:54:15