Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec 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 20/09/2011, 10h56   #1
Membre du Club
 
Avatar de Palsajicoco
 
Étudiant
Inscription : février 2007
Messages : 229
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 229
Points : 50
Points : 50
Envoyer un message via MSN à Palsajicoco Envoyer un message via Yahoo à Palsajicoco Envoyer un message via Skype™ à Palsajicoco
Par défaut Valeur dominante de la table.

Salut,

Je souhaite faire une requête SQL sur la valeur dominante de ma table. J'ai des entrées de la forme 4, 6, 128, 64 ... je pourrai faire le max et le min sans souci mais pour la moyenne ça ne donne aucun sens d'avoir un chiffre autre que 4, 6, 128 64 ... du coup, je devrai avoir la valeur dominante de la table (par exemple si j'ai 4, 4, 4, 4, 64, 64, 8 => la valeur dominante sera 4), est ce possible avec SQL?

Merci d'avance.
Palsajicoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h07   #2
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 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Fait un comptage de chaque valeur et cherche le max.
Essaie ceci :
Code :
1
2
3
4
SELECT valeur, COUNT(*) AS nombre
FROM la_table
GROUP BY valeur
HAVING COUNT(*) = MAX(COUNT(*))
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h29   #3
Membre du Club
 
Avatar de Palsajicoco
 
Étudiant
Inscription : février 2007
Messages : 229
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 229
Points : 50
Points : 50
Envoyer un message via MSN à Palsajicoco Envoyer un message via Yahoo à Palsajicoco Envoyer un message via Skype™ à Palsajicoco
Merci pour la réponse,

J'ai essayé ce que tu as dit mais il me remet:

Citation:
Error Code: 1111
Invalid use of group function
Voici ma requete:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
SELECT 
	netBandwidth, IFNULL(latestTPZ,"N/A") AS latestTPZ, maxTPZ, minTPZ, avgTPZ, latestTRZ, 
	maxTRZ, minTRZ, avgTRZ, latestMOD, maxMOD, minMOD, avgMOD, latestMODZ, maxMODZ, minMODZ, avgMODZ, netBandwidthZ
 
FROM  
	physicalConnection pc
	INNER JOIN ptp apt ON apt.ptp_id = pc.ptp_idAend
	INNER JOIN board ab ON apt.board_id = ab.board_id
	INNER JOIN networkElement an ON ab.networkElement_id = an.networkElement_id
	INNER JOIN location al ON an.location_id = al.location_id
	INNER JOIN ptp zpt ON  zpt.ptp_id = pc.ptp_idZend
	INNER JOIN board zb ON zpt.board_id = zb.board_id
	INNER JOIN networkElement zn ON zb.networkElement_id = zn.networkElement_id
	INNER JOIN location zl ON zn.location_id = zl.location_id
	LEFT JOIN (
		SELECT 
		ae.schedule_id,
		ae.ptp_id AS ptp_id,
		ael.currentModulation AS latestMOD, 
		CONCAT(MAX(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS maxMOD, 
    CONCAT(MIN(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS minMOD,
    ROUND(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3)),0), COUNT(*) AS avgMOD,
		ROUND(ael.netBandwidth/1024,2) AS netBandwidth
		FROM 
			ethernetPerformance ae 
			INNER JOIN ethernetPerformanceLive ael ON ae.ptp_id=ael.ptp_id 
		GROUP BY ae.ptp_id, ae.schedule_id, ae.currentModulation 
    HAVING COUNT(*) = MAX(COUNT(*))
	)  AS ae ON pc.ptp_idAend= ae.ptp_id 
	LEFT JOIN (
		SELECT 
		ze.schedule_id,
		ze.ptp_id AS ptp_id,
		ROUND(zel.throughPut,2) AS latestTPZ, 
		ROUND(MAX(ze.throughPut),2) AS maxTPZ, 
		ROUND(MIN(ze.throughPut),2) AS minTPZ, 
		ROUND(AVG(ze.throughPut) ,2) AS avgTPZ,
		zel.currentModulation AS latestMODZ, 
		ROUND(MAX(SUBSTR(ze.currentModulation,0,length(ze.currentModulation)-4)) ,2) AS maxMODZ, 
		ROUND(MIN(SUBSTR(ze.currentModulation,0,length(ze.currentModulation)-4)) ,2) AS minMODZ, 
		ROUND(AVG(SUBSTR(ze.currentModulation,0,length(ze.currentModulation)-4)) ,2) AS avgMODZ, 
		ROUND(zel.transmitRate/(1024*1024),2) AS latestTRZ, 
		ROUND(MAX(ze.transmitRate) /(1024*1024),2) AS maxTRZ, 
		ROUND(MIN(ze.transmitRate) /(1024*1024),2) AS minTRZ, 
		ROUND(AVG(ze.transmitRate) /(1024*1024),2) AS avgTRZ, 
		ROUND(zel.netBandwidth/1024,2) AS netBandwidthZ
		FROM 
			ethernetPerformance ze 
			INNER JOIN ethernetPerformanceLive zel ON ze.ptp_id=zel.ptp_id 
		GROUP BY ze.ptp_id, ze.schedule_id
	)  AS ze ON pc.ptp_idZend= ze.ptp_id 
 
WHERE 1
	AND
	(
		ae.ptp_id IS NOT NULL 
		OR ze.ptp_id IS NOT NULL 	
	)
GROUP BY 
	physicalConnection_id;
La variable concernée est avgMOD, des manipulations sont nécessaire avant de faire la calcul du au format initial de la variable, mais le min et max marchent correctement,
Palsajicoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 12h04   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Peut-être comme ceci
Code mysql :
1
2
3
4
SELECT valeur, COUNT(*) AS nombre
FROM la_table
GROUP BY valeur
ORDER BY nombre DESC LIMIT 1
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 12h16   #5
Membre du Club
 
Avatar de Palsajicoco
 
Étudiant
Inscription : février 2007
Messages : 229
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 229
Points : 50
Points : 50
Envoyer un message via MSN à Palsajicoco Envoyer un message via Yahoo à Palsajicoco Envoyer un message via Skype™ à Palsajicoco
Merci pour la réponse,

en fait, je préfère pas avoir de limites et je préfère pas afficher le résultat dans nombre non plus:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
		ae.schedule_id,
		ae.ptp_id AS ptp_id,
		ael.currentModulation AS latestMOD, 
		CONCAT(MAX(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS maxMOD, 
                CONCAT(MIN(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS minMOD,
                ROUND(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3)),0) AS avgMOD,
                COUNT(*) AS nombre,
		ROUND(ael.netBandwidth/1024,2) AS netBandwidth
		FROM 
			ethernetPerformance ae 
			INNER JOIN ethernetPerformanceLive ael ON ae.ptp_id=ael.ptp_id 
		GROUP BY ae.ptp_id, ae.schedule_id, ae.currentModulation 
                ORDER BY nombre DESC LIMIT 1
tout ce dont j'ai besoin c'est avoir la valeur dominante de la table dans avgMOD.
Palsajicoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 12h52   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par Palsajicoco Voir le message


tout ce dont j'ai besoin c'est avoir la valeur dominante de la table dans avgMOD.
Alors
Code mysql :
ORDER BY avgMOD DESC LIMIT 1
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h09   #7
Membre du Club
 
Avatar de Palsajicoco
 
Étudiant
Inscription : février 2007
Messages : 229
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 229
Points : 50
Points : 50
Envoyer un message via MSN à Palsajicoco Envoyer un message via Yahoo à Palsajicoco Envoyer un message via Skype™ à Palsajicoco
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
		ae.schedule_id,
		ae.ptp_id AS ptp_id,
		ael.currentModulation AS latestMOD, 
		CONCAT(MAX(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS maxMOD, 
                CONCAT(MIN(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS minMOD,
                ROUND(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3)),0) AS avgMOD,
                COUNT(*) AS nombre,
		ROUND(ael.netBandwidth/1024,2) AS netBandwidth
		FROM 
			ethernetPerformance ae 
			INNER JOIN ethernetPerformanceLive ael ON ae.ptp_id=ael.ptp_id 
		GROUP BY avgMOD, ae.ptp_id, ae.schedule_id
                ORDER BY avgMOD DESC LIMIT 1
Comme ceci? je pense que ça n'aura plus aucun sens dans ce cas .. en plus le count n'intervient jamais du coup je filtre mes réponse et j'aurai 56 au lieu de 80 ...

Je pensais qu'il devrai y avoir une commande pré définie SQL pour avoir le dominant parce que là c'est mort
Palsajicoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h21   #8
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Si j'ai bien compris ce que tu entends par 'dominant' (encore qu'il faudrait savoir comment gèrer les ex-aequo), je ne comprends rien aux calculs ésotériques auxquels tu te livres dans la requête.
En outre, au départ, il s'agissait d'une table, et ensuite on voit apparaître une seconde table en jointure.
Tout cela devient très confus et fouillis, surtout pour qui n'est pas dans ta problématique.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h44   #9
Membre du Club
 
Avatar de Palsajicoco
 
Étudiant
Inscription : février 2007
Messages : 229
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 229
Points : 50
Points : 50
Envoyer un message via MSN à Palsajicoco Envoyer un message via Yahoo à Palsajicoco Envoyer un message via Skype™ à Palsajicoco
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT 
		ae.schedule_id,
		ae.ptp_id AS ptp_id,
		CONCAT(MAX(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS maxMOD, 
    CONCAT(MIN(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3))),"Qam") AS minMOD,
    ROUND(SUBSTR(cast(ae.currentModulation AS char),1,(Length(ae.currentModulation)-3)),0) AS avgMOD,
    COUNT(*) AS nombre
		FROM 
			ethernetPerformance ae 
		GROUP BY avgMOD, ae.ptp_id, ae.schedule_id
    ORDER BY avgMOD DESC LIMIT 1
On peut oublier la jointure pour cette procédure, voila une requête plus simple. Je devrai faire un MAX, MIN et AVG. Mais le AVG pour mon cas n'est pas cohérent avec mes données vue que le type du champ est un enum(4,16,32,...) du coup je devrai avoir le dominant mais pas la moyenne. Voila
Palsajicoco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h31   #10
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Peut-être devrais-tu t'inspirer de ce que l'on a fait ici, c'est à dire en mettant le problème dans une sous-requête corrélée à l'intérieur même de la projection (SELECT).
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h31.


 
 
 
 
Partenaires

Hébergement Web