Comment faire cette requette mysql

doom
WRInaute discret
WRInaute discret
 
Messages: 155
Inscription: 21 Déc 2003

Comment faire cette requette mysql

Message le Jeu Juil 13, 2006 21:37

salut,
voilà, je possède une table mysql avec 3 champs, que l'on va noter idi ch1 , ch2 et ch3
Et j'ai envie en fet de faire une requête qui supprime une insertion quand il y a 2 insertions dont les champs ch1 et ch2 sont identiques

exemple :
On a ça :
Code: Tout sélectionner
ch1  |  ch2  |  ch3
----------------------
toto | bibi  | juju
toto | bibi  | bobo
toto | bobo  | juju


et je veux une requête pour obtenir ça :
Code: Tout sélectionner
ch1  |  ch2  |  ch3
----------------------
toto | bibi  | bobo
toto | bobo  | juju

Libre choix de supprimer une des 2 au hasard des insertions identiques.

Voilà, je vous remercie d'avance de votre aide!

DooM


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Jeu Juil 13, 2006 22:38

Je ferais un truc du style :

SELECT ch1, ch2, max(ch3) as ch3
FROM LATABLE
GROUP BY ch1, ch2

Max ou min si tu veux le premier ou le dernier dans l'ordre alphabetique.

doom
WRInaute discret
WRInaute discret
 
Messages: 155
Inscription: 21 Déc 2003

Message le Jeu Juil 13, 2006 22:49

génial c'est nickel ça marche super, merci beaucoup!

doom
WRInaute discret
WRInaute discret
 
Messages: 155
Inscription: 21 Déc 2003

Message le Jeu Juil 13, 2006 23:07

maintenant je cherche a pouvoir comptabiliser combien j'obtient de resultats différents pour un même ch1, exemple :
Code: Tout sélectionner
ch1  |  ch2  |  ch3
----------------------
toto | bibi  | bobo
toto | bobo  | juju

ce qui nous donne 2 résultats différents pour un meme ch1.
Après, il me faut soumettre dans une autre table ce chiffre 2 pour le ch1='toto'

vous avez une idée, ?


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Jeu Juil 13, 2006 23:23

SELECT count(ch1) as NB, ch1
FROM LATABLE
GROUP BY ch1

doom
WRInaute discret
WRInaute discret
 
Messages: 155
Inscription: 21 Déc 2003

Message le Jeu Juil 13, 2006 23:27

a oui super bien joué;
par contre, est-il possible de grouper ces 2 requettes, cad :

SELECT ch1, ch2, max(ch3) as ch3
FROM LATABLE
GROUP BY ch1, ch2

et

SELECT count(ch1) as NB, ch1
FROM LATABLE
GROUP BY ch1


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Jeu Juil 13, 2006 23:29

Tu peux tenter ça, mais en mysql je suis pas certain de la syntaxe :

SELECT count(ch1) as NB, ch1
FROM (
SELECT ch1, ch2, max(ch3) as ch3
FROM LATABLE
GROUP BY ch1, ch2 ) temptable
GROUP BY ch1

doom
WRInaute discret
WRInaute discret
 
Messages: 155
Inscription: 21 Déc 2003

Message le Jeu Juil 13, 2006 23:36

effectivement, petit problème de synthaxe, en effet il affiche : ... for the right syntax to use near 'SELECT id, ip, max(date) as date FROM rech_ip GROUP BY id, ip )


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Ven Juil 14, 2006 7:19

Chez moi ça marche, tu peux mettre exactement ta derniere requete avec les 2 imbriquées ?

Sir Dipp
WRInaute passionné
WRInaute passionné
 
Messages: 1025
Inscription: 21 Juil 2003

Message le Ven Juil 14, 2006 8:09

Les requêtes imbriqué sont uniquement disponible depuis MySQL 4.1 et beaucoup de mon en sont encore à la version 3.

C'est peut-être pour ça :-)


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Ven Juil 14, 2006 9:00

Bien vu Sir Dipp !

Alors si tu peux pas faire de requête imbriqué il va falloir faire des tables temporaires :

CREATE TEMPORARY TABLE table_temp (ch1 varchar(20), ch2 varchar(20), ch3 varchar(20));

INSERT INTO table_temp SELECT ch1, ch2, max(ch3) as ch3 FROM test GROUP BY ch1, ch2;

SELECT count(ch1) as NB, ch1 FROM table_temp GROUP BY ch1;

DROP TABLE table_temp;

Avec le php :
Code: Tout sélectionner
$strSQL = "CREATE TEMPORARY TABLE table_temp (ch1 varchar(20), ch2 varchar(20), ch3 varchar(20));";
mysql_query($strSQL);
$strSQL = "INSERT INTO table_temp SELECT ch1, ch2, max(ch3) as ch3 FROM test GROUP BY ch1, ch2;";
mysql_query($strSQL);

$strSQL = "SELECT count(ch1) as NB, ch1 FROM table_temp GROUP BY ch1;";
$result = mysql_query($strSQL);
while ($row = mysql_fetch_array ($result)) {
   echo $row["NB"]." | ".$row["ch1"]."<br />";
}

$strSQL = "DROP TABLE table_temp;";
mysql_query($strSQL);

doom
WRInaute discret
WRInaute discret
 
Messages: 155
Inscription: 21 Déc 2003

Message le Ven Juil 14, 2006 11:02

merci pr votre aide;

il me dit : Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/web/site/tmp.php on line 15

(ligne 15 : while ($row = mysql_fetch_array ($result)) { )
Dernière édition par doom le Mer Nov 01, 2006 12:15, édité 1 fois.


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Ven Juil 14, 2006 11:30

Ca marche chez moi pourtant, j'ai testé avant de poster.


Tu peux mettre tout ton bout de code ?

doom
WRInaute discret
WRInaute discret
 
Messages: 155
Inscription: 21 Déc 2003

Message le Ven Juil 14, 2006 11:35

Code: Tout sélectionner
    // on se connecte a la base
    $db = mysql_connect('localhost', '****', '****')  or die('Erreur de connexion '.mysql_error());
    // sélection de la base 
    mysql_select_db('****',$db)  or die('Erreur de selection '.mysql_error());


$strSQL = "CREATE TEMPORARY TABLE table_temp (id varchar(20), ip varchar(20), date varchar(20));";
mysql_query($strSQL);
$strSQL = "INSERT INTO table_temp SELECT id, ip, max(date) as date FROM rech_ip GROUP BY id, ip;";
mysql_query($strSQL);

$strSQL = "SELECT count(id) as NB, id FROM table_temp GROUP BY id;";
$result = mysql_query($strSQL);
while ($row = mysql_fetch_array ($result)) {
   echo $row["NB"]." | ".$row["id"]."<br />";
}

$strSQL = "DROP TABLE table_temp;";
mysql_query($strSQL);


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Ven Juil 14, 2006 11:43

Tu as un champ date que tu veux inserer dans un varchar, c'est peut-etre ça.

Remplace cette ligne :
$strSQL = "CREATE TEMPORARY TABLE table_temp (id varchar(20), ip varchar(20), date varchar(20));";

Par :
$strSQL = "CREATE TEMPORARY TABLE table_temp (id varchar(20), ip varchar(20), date date);";

Comment faire cette requette mysql

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité