GROUPE PAR ne pas le groupe NULL
J'essaie de trouver un moyen de renvoyer les résultats à l'aide de groupe par fonction.
GROUPE PAR fonctionne comme prévu, mais ma question est: Est-il possible d'avoir un groupe par ignorer champ NUL. De sorte qu'il ne regroupe pas les valeurs Null, ensemble, parce que j'ai encore besoin de toutes les lignes où le champ est NULL.
SELECT `table1`.*,
GROUP_CONCAT(id SEPARATOR ',') AS `children_ids`
FROM `table1`
WHERE (enabled = 1)
GROUP BY `ancestor`
Alors maintenant, disons que j'ai 5 lignes et ancêtre champ est NULL, il me renvoie 1 ligne....mais je veux que tous les 5.
- Pourriez-vous poster un exemple?
- Vous pouvez utiliser
GROUP BY COALESCE(GroupingColumn, PrimaryKey)
pourraient avoir besoin d'un ajustement pour les types de données, composite PKs ou quoi que ce soit. - OK, apparemment, "ce comportement est défini dans le SQL-2003 standard." Surprenant.
- Geret'kal: Joe Celko citation: "En SQL, quand tu fais un GROUP BY, vous obtenez un partitionnement, et les valeurs Null sont tous mis dans un groupe. Cela a été débattu dans les normes ANSI X3H2 Comité. Si nous avions utilisé une stricte égalité, chaque NULL serait sa propre classe et des choses serait un gâchis. Donc nous avons inventé le regroupement. Le groupement est pratique pour de nombreuses requêtes et pas seulement pour les fonctions d'agrégation. Il a la belle propriété de plus de revenir à deux valeurs logiques (2VL) et on aime ça."
- Suggestion: supprimer les lignes
WHERE ancestor is NOT NULL
puisUNION
les lignesWHERE ancestor is NULL
en utilisant une valeur par défaut appropriée pourchildren_ids
. Je pense que cette requête serait plus facile à maintenir. - C'est une bonne idée.
- Utilisez une combinaison de l'incrément automatique de clé primaire avec une lettre. N1, N2, N3
Vous devez vous connecter pour publier un commentaire.
Vous devriez peut-être ajouter quelque chose à null dans les colonnes afin de les rendre uniques et groupe sur qui? Je cherchais une sorte de séquence à utiliser à la place de l'UUID (), mais cela pourrait fonctionner tout aussi bien.
Lors d'un regroupement par colonne
Y
, toutes les lignes pour lesquelles la valeur deY
estNULL
sont regroupés.Ce comportement est défini par le code SQL-2003 standard, si c'est un peu surprenant parce que
NULL
n'est pas égal àNULL
.Vous pouvez contourner le problème en regroupant sur une valeur différente, certains fonction (mathématiquement parlant) des données dans votre colonne de regroupement.
Si vous avez une colonne unique
X
alors c'est facile.D'entrée
Sans fixer
Résultat:
Avec fix
Résultat:
Prenons regarder de plus près comment cela fonctionne
Résultat:
Si vous n'avez pas de colonne unique que vous pouvez utiliser, vous pouvez essayer de générer une unique valeur de l'espace réservé à la place. Je vais laisser cela comme un exercice pour le lecteur.
GROUP BY IFNULL(required_field, id)
required_field
etid
sont du même type, peut être utiliséGROUP BY IFNULL(required_field, -id)
Y
,X
); => c'est changer les règles du jeu 🙂Peut-être la version plus rapide de la solution précédente dans le cas où vous ont un identificateur unique dans la table1 (supposons qu'il est table1.id) :