Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1326 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb de requete sql avec mysql

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb de requete sql avec mysql

n°1231217
loothof
Posté le 26-10-2005 à 09:27:36  profilanswer
 

Bonjour à tous et merci de l'aide que vous allez pouvoir m'apporter.
 
Je suis actuellement train de me pencher sur une requete sql mais je n'arrive pas a obtenir ce que je veut. Voici la situation:
 
J'ai une table contenant les champs suivant :  ip_src, ip_dest, inb, outb, lport , rport , timestamp.
 
Je veut effectuer une requete qui compte le nombre de ligne par ip. Clairement cette table stock les sessions d'un réseaux. Moi je veut faire un top 10 des sessions par hote. Voici ce que j'ai fait mais la clause UNION ne fonctionne pas (c'est inclu dans du php mais peu importe):
 

Code :
  1. "(SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter FROM "$database.$clause_condition." GROUP BY ip)".
  2. " UNION ".
  3. "(SELECT inet_ntoa(ip_dest) as ip , count(timestamp) as counter FROM ".$newdatabase.$clause_condition." GROUP BY ip) order by counter desc LIMIT 0,10";


Je pense que la clause union ne s'applique pas s'il s'agit de la meme table. Je ne trouve pas de solution a ma question. Donc je fait appele a vous merci.
 
   
 

mood
Publicité
Posté le 26-10-2005 à 09:27:36  profilanswer
 

n°1231238
Beegee
Posté le 26-10-2005 à 09:51:37  profilanswer
 

Quelle version de mySql ?
Il aime probablement pas les parenthèses ...
le problème étant de savoir à quoi sera appliqué le ORDER BY si on les enlève.
 
Essaye :
 
SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter
FROM ...
GROUP BY ip
UNION
SELECT inet_ntoa(ip_dest) as ip , count(timestamp) as counter
FROM ...
GROUP BY ip
ORDER BY counter DESC
LIMIT 0,10;
 
Et si ça foire, mais tu as une version récente de mySql qui accepte les sous-requêtes, essaye :
 
SELECT ip, counter
FROM
(SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter
 FROM ...
 GROUP BY ip
 UNION
 SELECT inet_ntoa(ip_dest) as ip , count(timestamp) as counter
 FROM ...
 GROUP BY ip)
ORDER BY counter DESC
LIMIT 0,10;

n°1231273
loothof
Posté le 26-10-2005 à 10:19:08  profilanswer
 

Salut Beegee et mercie de ta reponse. Ta solution ne résoud pas mon pb. En effet la prémiere requete n'effectue pas l'union, le resultat ne tiens donc compte que de l'ip_src sans additionner l'ip_dst.
 
En ce qui concerne la seconde requete. celle-ci n'est pas executé. il y a une erreur de requete. ma version de mysql est la suivante: MySQL 4.0.23
 
Merci de m'aider encore.

n°1231278
sircam
I Like Trains
Posté le 26-10-2005 à 10:22:54  profilanswer
 

Commence par faire du SQL plutôt du PHP !!!
 
Chaque jour, il faut le répéter : SQL<>PHP.
 
Règle de base en info : réduire la portée du problème et l'isoler. Là, tu proposes du PHP _ET_ du SQL : deux fois plus de risque d'erreur. Perso, je ne commence même pas à tenter de trouver la cause du pb dans ces conditions.
 
"il y a une erreur de requete"
 
==> Et on devine parfaitement laquelle. :o
 
[:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1231300
loothof
Posté le 26-10-2005 à 10:31:13  profilanswer
 

Comme je l'ai dit dans mon premeier message, mon probléme est un probléme sql et non pas php. Dans ce cas de figure le langage d'exploitation des requetes m'importe peu. (python, php, ...).  
Je concentre uniquement mon pb sur le sql. Peu etre que je me suis mal fait comprendre ou as tu eu un pb de comprhension. Enfin bref pas grave.
 
Sinon pour l'erreur de requete c une erreur de syntaxe car ma version de mysql est un 4.0.23 or les sous-requetes ne sont permisent qu'a partir des versions 4.1 (pas de bole).
 
Je vous remercie de m'apporter votre aide

n°1231314
sircam
I Like Trains
Posté le 26-10-2005 à 10:39:36  profilanswer
 

loothof a écrit :

Comme je l'ai dit dans mon premeier message, mon probléme est un probléme sql et non pas php.


Dans ce cas, que vient faire cette syntaxe PHP ?
 

loothof a écrit :

Dans ce cas de figure le langage d'exploitation des requetes m'importe peu. (python, php, ...).


Effectivement, donc tu vires le PHP.
 

loothof a écrit :

Je concentre uniquement mon pb sur le sql.


Non, puisque tu livres du PHP.
 


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1231326
loothof
Posté le 26-10-2005 à 10:51:05  profilanswer
 

c t juste un copier coller de mon code.je ne croit pas que sa pose de pb de compréhension.
mais bon ...
bref voici ma requete SQL

Code :
  1. (SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter FROM `18` GROUP BY ip)
  2. UNION
  3. (SELECT inet_ntoa(ip_dst) as ip , count(timestamp) as counter FROM `18`GROUP BY ip)


 

n°1231329
Beegee
Posté le 26-10-2005 à 10:57:59  profilanswer
 

Tu peux poser ton problème en français ?
 
D'après la requête que tu écris, tu veux apparement le top 10 des ip (source ou destination, peu importe).
 
Peux-tu également donner l'erreur de mySql quand tu lances la requête ?
 
edit : au pire, tu fais les 2 requêtes indépendamment en SQL, et tu fais ensuite le top 10 en PHP.
 
Requête 1 :
 
SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter
FROM `18`
GROUP BY ip
ORDER BY counter DESC
LIMIT 0,10;
 
Requête 2 :
 
SELECT inet_ntoa(ip_dst) as ip , count(timestamp) as counter
FROM `18`
GROUP BY ip
ORDER BY counter DESC
LIMIT 0,10;
 
Et ensuite, en PHP, tu combines les 2 vecteurs contenant le résultat des requêtes, tu le tries comme il faut et tu prends le top 10.


Message édité par Beegee le 26-10-2005 à 11:05:20
n°1231331
loothof
Posté le 26-10-2005 à 11:04:19  profilanswer
 

oui voila je souhaite avoir le top 10 des ip (source ou destination, peu importe).
 
Lors de l'execution de ma requete mysql ne me renvoi pas d'erreur. il me retourne juste le resultat de ce qu'il y a avant le union c a dire de :
 

Code :
  1. (SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter FROM `18` GROUP BY ip)


 
Il ne prend pas en compte le UNION Je ne sait vraiment pas pourquoi. Peut etre parce qu'il s'agit d'un union sur une meme table non?
Merci pour ton aide Beegee

n°1231336
Beegee
Posté le 26-10-2005 à 11:07:02  profilanswer
 

L'UNION devrait marcher.
Essaye des requêtes de base, par exemple :
 
SELECT count(*) as counter from `18`
UNION
SELECT count(*) as counter from `18`;
 
Et ensuite, complique au fur et à mesure.
Fais tout ça sous mySql directement, sans passer par du PHP ou autre langage.

mood
Publicité
Posté le 26-10-2005 à 11:07:02  profilanswer
 

n°1231337
sircam
I Like Trains
Posté le 26-10-2005 à 11:07:10  profilanswer
 

Citation :

je ne croit pas que sa pose de pb de compréhension.
mais bon ...


 
Pour la 100è fois... C'est une règle élémentaire en informatique !!!
 
On commence pour diviser le pb en deux : est-ce un pb SQL ou PHP ? Pour le savoir, on commence par tester la requête SQL indép. du PHP.
 
:o


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1231372
loothof
Posté le 26-10-2005 à 11:29:05  profilanswer
 

Merci Beegee. On es bien d'accord que cette requete devrait me retourner 2 fois le nombre d'entrée dans cette table. Soit 2*69762 = 139524.  
Or le resultat retourné n'est que 69762.
 
dsl sircam mais si mon pb aurai été du php je l'aurai mit au bonne endroit. A savoir dans la section php et non sql.  
Et pour info avant de demander de l'aide j'essaie toute les possibles que je trouve et donc j'ai bien effectué mes requete indep. du php et je le fait tjs.
 

n°1231377
Beegee
Posté le 26-10-2005 à 11:34:07  profilanswer
 

Non, cette requête devrait te renvoyer 2 lignes, chacune contenant 69762 ... c'est la raison pour laquelle tu ne comprends pas pourquoi tu ne vois que les données du 1er SELECT depuis le début ! C'est parce que tu ne regardes que les premières lignes renvoyées !!!
 
Si tu veux faire des sommes de compteurs, il te faudra probableme une sous-requête, qui n'est pas supportée par ta version de mySql, d'où ma proposition plus haut de faire 2 requêtes et de faire le reste en PHP.


Message édité par Beegee le 26-10-2005 à 11:36:59
n°1231392
loothof
Posté le 26-10-2005 à 11:59:18  profilanswer
 

Merci Beegee
 
Cette requete me renvoi deux ligne si j'interroge deux table differentes.
 
Oui j'ai bien pensé aussi faire deux requetes mais ceci ne me donnera pas exactement le top 10. Car si je limite mes resultat a 10 dans la premiere et dans la deuxieme requete. le compteur des autres ip ne sera pas pris en compte.Je m'explike prenons un exemple concret. lors du resultat de ma premiere requete j'ai:
 

Code :
  1. 1 ==> 10.X.X.X 10345
  2. 2 ==> 10.Y.Y.Y 345
  3. .
  4. .
  5. .
  6. 10 ==> 10.Z.Z.Z 32


 
lors du resultat de ma seconde requete j'ai :

Code :
  1. 1 ==> 10.A.A.A 10354
  2. 2 ==> 10.B.B.B 355
  3. .
  4. .
  5. .
  6. 10 ==> 10.C.C.C 32
  7. puis en faite la suite du classement est : 11 ==> 10.X.X.X 20


 
Si mes requetes sont limité a 10 resultat alors le top 10 vas me mettre l'adresse 10.A.A.A en premier alors qu'en réalité c'est l'adresse 10.X.X.X qui l'est.
En revanche si je ne limite pas mes requetes a 10 resultats et fait mon classement via un traitement en php. je suis confronté a un encombrement mémoire du faite de la grosseur du tableau engendré. Il faut donc que j'optimise ma requete SQL mais je ne voit pas du tout comment faire.
 
J'espere avoir été clair dans mon explication.
 
Merci beaucoup de ton aide

n°1231398
Beegee
Posté le 26-10-2005 à 12:11:05  profilanswer
 

J'ai pas tout compris ...
 
Tu peux réexpliquer avec des mots ce que tu souhaites faire ?
 
Et tout faire sur mySql directement, en nous donnant le message d'erreur ou le résultat des requêtes lancées.
 
Le problème vient apparemment du fait que le LIMIT s'appliquerait au 1er SELECT d'après ce que tu racontes ...
Ma proposition de lancer 2 requêtes et de faire le tri en PHP tient toujours.
Tu peux également le faire en SQL avec des tables temporaires.
 
Exemple :
 
CREATE TABLE temp_table
AS SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter
FROM `18`
GROUP BY ip
ORDER BY counter DESC
LIMIT 0,10;
 
INSERT INTO temp_table
SELECT inet_ntoa(ip_src) as ip , count(timestamp) as counter
FROM `18`
GROUP BY ip
ORDER BY counter DESC
LIMIT 0,10;
 
SELECT ip, SUM(counter) as total_counter
FROM temp_table
GROUP BY ip
ORDER BY total_counter DESC
LIMIT 0,10;
 
(ça c'est dans le cas où tu veux sommer toutes les occurences d'une ip, qu'elle soit source ou destination).

n°1231406
sircam
I Like Trains
Posté le 26-10-2005 à 12:17:08  profilanswer
 

Citation :

dsl sircam mais si mon pb aurai été du php je l'aurai mit au bonne endroit. A savoir dans la section php et non sql.  
Et pour info avant de demander de l'aide j'essaie toute les possibles que je trouve et donc j'ai bien effectué mes requete indep. du php et je le fait tjs.


[:kiki]
 
Mais alors pourquoi poster du PHP ??????? Pourquoi ??????
 
J'abandonne. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1231415
loothof
Posté le 26-10-2005 à 12:24:50  profilanswer
 

Créer une table temporaire déplace juste mon pb mais ne le résoud pas. En effet se ne sera plus le php qui encombrera la memoire mais mysql. Car mes tables sont énormes.
 
Je voudrai une requete qui effectue la somme des occurences d'une ip qu'elle soit source ou destination.
 
Merci

n°1231429
Beegee
Posté le 26-10-2005 à 12:33:42  profilanswer
 

Ce qui sera long, ce n'est pas l'étape de création de table temporaire, puisqu'elle ne contiendra au pire que 20 lignes ... mais bien les GROUP BY des requêts, que tu ne peux pas éviter.

n°1231437
loothof
Posté le 26-10-2005 à 12:39:04  profilanswer
 

je vais faire des essais. je te remercie bcp beegee


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb de requete sql avec mysql

 

Sujets relatifs
[ASP - Sql Server 2000] Défi pour trouver une requête complexetraitement de requete access avec VB
[Résolu][SQL] PB de requete (2en 1 ? comme le ...) trop dur pour moi !pkoi cette commande mysql ne fait pas ce qu'elle est censée faire ?
[Résolu][SQL] Convertion de valeurs dans une requete SQLrequete d'ajout qui ne fait rien
[MySQL] Automatiser un import/export de data entre 2 bases distantes ?Probleme pour Configurer MySql en Serveur Dedie
[MySQL] LOAD DATA LOCAL INFILEPHP MySql, bases de données etc - comment faire ???
Plus de sujets relatifs à : Pb de requete sql avec mysql


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR