2010-08-15 8 views
0

Ma requête:Valeurs SQL GROUP BY et NULL: comment regrouper mes résultats uniquement par des valeurs non nulles?

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 

Sans les SOMME() et GROUP BY clauses de cette requête renvoie les résultats souhaités, moins la valeur importante TotalQuantity.

La tâche qui m'a bloqué pour le moment est la construction de la clause GROUP BY afin qu'elle "ignore" les valeurs NULL ou manquantes des réponses aux enchères. Les données sont telles que les résultats seront un ensemble mixte d'éléments - certains ont des entrées dans la table de réponses aux réponses et d'autres non.

EDIT: Je souhaite que les entrées avec des valeurs NULL dans la table de réponses aux demandes s'affichent. Avec la clause GROUP BY actuelle, ils ne le sont pas. Je devrais noter que la seule raison pour laquelle j'utilise le regroupement est que je peux obtenir la valeur de quantité totale. Voici un exemple de la sortie de requête sans SUM() et les clauses 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 | 
+-------+------------+------+---------------------------+------+------------+-----------+-----------+---------------------+---------------------+-----------+----------+-------+--------+----------+--------+-----------+----------+---------------------+--------------+---------------+--------------+-----------+------------+------+-----------+----------+----------------+-----------------+---------------------+---------------------+-----------+----------+---------------------+---------------------+--------------------+--------+-------------+----------+------+------------------+-------------+---------------------+---------------------+-------------------+---------------------+ 

Voici un exemple de la sortie de la requête avec SUM() et les clauses 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

Je ne suis pas sûr si je vous comprends complètement. Vous voulez que les lignes de résultat avec la valeur NULL dans les colonnes 'bidresponseitemid' et' bidresponsepersonid' ne s'affichent pas? Ou ils ne se présentent pas et vous le voulez? Peut-être inclure un exemple de jeu de résultats (vous pouvez obtenir de beaux textes en utilisant la commande mysql dans une console/un terminal) et décrire ce que vous voulez avoir différemment. "WHERE' bidresponsepersonid' N'EST PAS NUL "pourrait être quelque chose que vous cherchez. – Thomas

+0

merci thomas. Je vais clarifier ci-dessus. –

Répondre

1

Vous devez inclure toutes les colonnes significatives non agrégées dans votre clause GROUP BY. En ce moment, vous ne groupez pas par createdAt etc.

0

Si vous avez besoin de toutes ces lignes SUM() et que le GROUP BY requis ne sera pas une bonne solution.

La meilleure solution sera probablement d'ajouter simplement les quantités lors du traitement/de la boucle à travers toutes les lignes de votre code client/script.

Sinon, vous pouvez interroger deux fois, une fois avec GROUP BY et SUM() pour obtenir la quantité pour chaque items.id mais même faire une boucle supplémentaire à travers toutes les lignes de votre code client sera probablement plus rapide que l'interrogation deux fois, pourrait aussi dépendre de la taille du résultat.

+0

vous avez raison, je pourrais faire le traitement côté client, mais j'ai juste le sentiment qu'il doit y avoir un moyen beaucoup plus facile ... si seulement je pouvais appliquer une sorte de règle WHERE à la clause GROUP ... –

+0

'GROUP BY' va fusionner vos lignes comme vous le dites. Avec un 'GROUP BY items.id' vous aurez toujours juste une ligne pour cet id. Je ne suis pas au courant d'une fonction qui fait ce que vous voulez qu'elle fasse. Si vous voulez tout faire avec SQL, vous pouvez toujours envoyer 2 requêtes par exemple: 'SELECT SUM (tagsitems.quantity) AS totalquantity, tagsitems.itemid FROM tagsitems GROUP BY tagitems.itemid' et votre autre. Btw: n'utilisez pas *, sauf que vous utilisez vraiment 100%. – Thomas

+0

il s'est avéré que changer simplement le 3ème champ dans la clause group by à itemscontacts.personid au lieu de bidresponses.personid me donne exactement ce dont j'ai besoin! –