Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2011, 22h39   #1
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Par défaut MIN et NULL : j'en veux pas

Bonjour.

J'aimerais récupérer d'une table la valeur minimale d'une colonne parmi certaines lignes.
S'il n'y a aucune ligne je ne souhaite pas de résultat.
Pourtant le comportement de MIN (à l'instar de MAX) est de renvoyer un résultat NULL.

Y a-t'il une façon futée de se débarrasser des lignes ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
NSERT `Players` (
	`tableID`
	, `userID`
	, `seat`
	, `joinedOn`
)
SELECT
	1
	, 1
	, MIN(`n`)
	, NOW()
FROM `Tables` AS TBL
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 22h56   #2
Membre chevronné
 
Avatar de Oishiiii
 
Administrateur de base de données
Inscription : août 2009
Messages : 404
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : août 2009
Messages : 404
Points : 643
Points : 643
Après le GROUP BY vous avez essayé HAVING MIN(col) IS NOT NULL ?

Suivant la version de MySQL ça ne passera peut-être pas.
Donc dans la clause SELECT utilisez COALESCE() pour remplacer NULL par une valeur arbitraire avant de l'exclure avec HAVING.

C'est parfois complexe de manipuler NULL.

A+
Oishiiii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 23h57   #3
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par Oishiiii Voir le message
Après le GROUP BY vous avez essayé HAVING MIN(col) IS NOT NULL ?

Suivant la version de MySQL ça ne passera peut-être pas.
Donc dans la clause SELECT utilisez COALESCE() pour remplacer NULL par une valeur arbitraire avant de l'exclure avec HAVING.

C'est parfois complexe de manipuler NULL.

A+
Le rapprochement entre les deux sujets est fallacieux mais ça me fait rire quand même

En fait, je crois qu'il suffit d'avoir sélectionné au moins une colonne (ou une expression on agrégé sur la colonne) qui provienne directement des tables pour que la ligne n'apparaisse pas (MIN(...) = NULL, passe encore mais TBL.`id` = NULL serait une aberration).
Il faut bien entendu
le GROUP BY qui va avec cette colonne.

Si aucune colonne n'est utile, on peut faire un truc moche genre SELECT ..., CASE WHEN 1 = 1 THEN valeur ELSE macolonnedumemetype END, ... FROM ... GROUP BY macolonnedumemetype.

J'ai bien dit "je crois", il suffit peut-être d'avoir une clause GROUP BY sur un sous ensemble des colonnes des tables.


EDIT: Je crois je sais
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 00h00   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
J'ai beau relire ta prose et ta requête, je ne comprends pas ton besoin !

Tu peux expliquer plus clairement ce que tu cherches à faire ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 09h35   #5
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Code :
1
2
3
4
5
6
7
8
 
SELECT
	1
	, 1
	, MIN(`n`)
	, NOW()
FROM `Tables` AS TBL
WHERE 'moncul' = 'poulet'
Renvoie une ligne.

Code :
1
2
3
4
5
6
7
8
9
 
SELECT
	TBL.`id`
	, 1
	, MIN(`n`)
	, NOW()
FROM `Tables` AS TBL
WHERE 'moncul' = 'poulet'
GROUP BY TBL.`id`
Ne renverra pas de ligne.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 11h49   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Ton besoin n'est toujours pas expliqué et tes requêtes sont fausses mais si tu as marqué résolu tu n'as peut-être plus besoin d'aide ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 12h18   #7
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Mes requêtes sont fausses ? O_o
Pourrais-je savoir en quoi ?
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 12h25   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Sergejack Voir le message
Mes requêtes sont fausses ? O_o
Pourrais-je savoir en quoi ?
Citation:
Code :
1
2
 
WHERE 'moncul' = 'poulet'
=> Tu ne compares pas ici la colonne moncul à la valeur poulet mais deux chaînes de caractères différentes donc le résultat est toujours faux et aucun résultat ne peut être retourné par la requête.

Donc quand tu dis que ta première requête renvoie une ligne, c'est faux !

Tu as résolu ton problème ou pas ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 13h05   #9
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par CinePhil Voir le message
Donc quand tu dis que ta première requête renvoie une ligne, c'est faux !
Si, c'est vrai (! x 2) et c'était tout mon problème.

Je t'en prie essaie donc ceci :
Code :
1
2
3
4
 
SELECT 1, MIN(n)
FROM (SELECT 1 AS n) X
WHERE 'moncul' = 'poulet'
Et ensuite ceci :

Code :
1
2
3
4
5
 
SELECT 1, MIN(n)
FROM (SELECT 1 AS n) X
WHERE 'moncul' = 'poulet'
GROUP BY 'd'' où ça sort, ça ?!'
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 13h17   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
OK, la première requête donne un résultat mais c'est à mon avis une bizarrerie supplémentaire de MySQL ou l'application d'une logique bizarre du genre p => q qui donne toujours vrai si p est faux.

La deuxième ne donne rien parce que le SGBD ne peut pas faire de regroupement sur un truc qui n'existe pas. Pas de regroupement => pas de résultat.

À part ça,
Citation:
Envoyé par CinéPhil
Tu as résolu ton problème ou pas ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 13h52   #11
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par CinePhil Voir le message
Pas de regroupement => pas de résultat.
Faux.
C'est la clause where qui fait qu'il n'y a pas de résultat.
Le "group by" affecte le comportement d'agrégation et donc MIN.

Tu peux essayer sans clause WHERE tu auras un résultat.

Par ailleurs, ce n'est pas une bizarrerie, par exemple ça fonctionne aussi ainsi sous SQL Server.
Il était tard quand j'ai posté.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 16h39   #12
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Si c'est, comme je le supposais à l'origine, la clause WHERE qui fait qu'il n'y a pas de résultat à la seconde requête, ça devrait aussi être le cas pour la première !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 18h07   #13
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Citation:
Envoyé par CinePhil Voir le message
Si c'est, comme je le supposais à l'origine, la clause WHERE qui fait qu'il n'y a pas de résultat à la seconde requête, ça devrait aussi être le cas pour la première !
Ça c'est l'idée qu'on se fait intuitivement devant un tel scénario.
Mais en fait, ça va un peu de paire avec COUNT duquel on attend un résultat, dont 0 quand il n'y a pas de ligne.

Donc, c'est cohérent même si ça peut surprendre.

(à essayer en ORACLE et DB2 aussi, pour voir)
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h10.


 
 
 
 
Partenaires

Hébergement Web