Pb de requete sql avec mysql

Pb de requete sql avec mysql - SQL/NoSQL - Programmation

Marsh Posté le 26-10-2005 à 09:27:36    

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.
 
   
 

Reply

Marsh Posté le 26-10-2005 à 09:27:36   

Reply

Marsh Posté le 26-10-2005 à 09:51:37    

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;

Reply

Marsh Posté le 26-10-2005 à 10:19:08    

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.

Reply

Marsh Posté le 26-10-2005 à 10:22:54    

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}
Reply

Marsh Posté le 26-10-2005 à 10:31:13    

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

Reply

Marsh Posté le 26-10-2005 à 10:39:36    

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}
Reply

Marsh Posté le 26-10-2005 à 10:51:05    

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)


 

Reply

Marsh Posté le 26-10-2005 à 10:57:59    

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
Reply

Marsh Posté le 26-10-2005 à 11:04:19    

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

Reply

Marsh Posté le 26-10-2005 à 11:07:02    

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.

Reply

Marsh Posté le 26-10-2005 à 11:07:02   

Reply

Marsh Posté le 26-10-2005 à 11:07:10    

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}
Reply

Marsh Posté le 26-10-2005 à 11:29:05    

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.
 

Reply

Marsh Posté le 26-10-2005 à 11:34:07    

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
Reply

Marsh Posté le 26-10-2005 à 11:59:18    

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

Reply

Marsh Posté le 26-10-2005 à 12:11:05    

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).

Reply

Marsh Posté le 26-10-2005 à 12:17:08    

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}
Reply

Marsh Posté le 26-10-2005 à 12:24:50    

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

Reply

Marsh Posté le 26-10-2005 à 12:33:42    

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.

Reply

Marsh Posté le 26-10-2005 à 12:39:04    

je vais faire des essais. je te remercie bcp beegee

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed