Besoin d'aide sur requête svp.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Besoin d'aide sur requête svp.

Message le Ven Nov 21, 2008 18:24

Bonjour,

J'essaye en vint de comparer des "id" affichés dans 2 tables afin de savoir les quelles ne sont pas utilisés.

Code: Tout sélectionner
<?php

include("data_bd.php");

mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir correctement remplit les donn&eacute;es du fichier data_bd.php.');

//on selectionne  distinctement les id des clients ayant déposé une annonce
$query2 = mysql_query("SELECT DISTINCT (id_du_client) FROM TYPE_DE_LOCATION");

$un_client="";

while($client_avec_annonce = mysql_fetch_array($query2))
{
   $un_client = $client_avec_annonce['id_du_client'];
   $un_client.="$id_du_client";


//On ne ferme pas la boucle et on selectionne tout les id  des clients inscrits qui sont différents des id clients ayant posté
$query1 = mysql_query("SELECT id FROM CLIENTS WHERE id != $un_client ORDER BY id ASC");

$mon="";

while($client = mysql_fetch_array($query1))
{
   $mon_id = $client['id'];
   $mon_id.="$id";

echo 'ID client sans annonce: '.$mon_id.'<br/>';
}
//on ferme la 1ere boucle
}
mysql_close();
?>


Forcément si je poste, c'est que sa ne fonctionne pas et j'aimerais beaucoup comprendre pourquoi.
Merci


Marie-Aude
Modérateur
Modérateur
 
Messages: 11870
Inscription: 5 Juin 2006

Message le Ven Nov 21, 2008 18:41

A mon avis tu pourrais faire beaucoup plus simple avec not_in_array() :)


dadovb
WRInaute passionné
WRInaute passionné
 
Messages: 2050
Inscription: 22 Nov 2005

Re: Besoin d'aide sur requête svp.

Message le Ven Nov 21, 2008 18:47

tryan a écrit:
Code: Tout sélectionner
while($client_avec_annonce = mysql_fetch_array($query2))
{
   $un_client = $client_avec_annonce['id_du_client'];
   $un_client.="$id_du_client";


//On ne ferme pas la boucle et on selectionne tout les id  des clients inscrits qui sont différents des id clients ayant posté
$query1 = mysql_query("SELECT id FROM CLIENTS WHERE id != $un_client ORDER BY id ASC");





Ton $un_client va être une string de la forme :

'14589$id_du_client' car tu concatène :

Code: Tout sélectionner
$un_client.="$id_du_client";


Donc ta requête
Code: Tout sélectionner
SELECT id FROM CLIENTS WHERE id != $un_client ORDER BY id ASC
doit avoir du mal non ?

Tes id en base ne pas des string du type :
id = 45987$id_du_client ?? 8O


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Ven Nov 21, 2008 19:08

Marie-aude: Je ne connais pas not_in_array() et une recherche sur GG ne donne pas grand chose, peut tu m'en dire un peut plus ?.


dadovb:
si je fait un echo''.$un_client.'<br/>'; , il me sort correctement tout les id.
En l'état, le code me ressort tout mes ID client en au moins 15 ou 20 exemplaires .. bref, sa boucle à mort...

Bon, je ne suis pas plus avancé ^^ mais merci tout de même.

Sullyvan
WRInaute discret
WRInaute discret
 
Messages: 90
Inscription: 20 Mai 2008

Message le Ven Nov 21, 2008 20:01

Bonjour,
je pense que c'est faisable en 2 requetes seulement à la place de xxx..

voici comment j'aurais procédé:
1- récupérer les id des clients qui sont dans la table TYPE_DE_LOCATION et les stocker dans un tableau
2- sélectionner les id des clients de la table CLIENTS qui ne sont pas dans le tableau créé en 1

ce qui donnerait:
Code: Tout sélectionner
//on selectionne  distinctement les id des clients ayant déposé une annonce
$query2 = mysql_query("SELECT DISTINCT (id_du_client) FROM TYPE_DE_LOCATION");
$client_avec_annonce = array();
while($client = mysql_fetch_array($query2))
{
   $client_avec_annonce[] = $client['id_du_client']
}

if (is_array($client_avec_annonce)) {
$query1 = mysql_query("SELECT id FROM CLIENTS WHERE id ! in ".join (',', $client_avec_annonce)." ORDER BY id ASC");

$mon="";

while($client = mysql_fetch_array($query1))
{
   $mon_id = $client['id'];

echo 'ID client sans annonce: '.$mon_id.'<br/>';

}
}


screuscreu
WRInaute impliqué
WRInaute impliqué
 
Messages: 968
Inscription: 14 Jan 2008

Message le Ven Nov 21, 2008 20:35

Je sais pas si j'ai pas tout compris mais pouquoi tu fais pas tout en une requete ?

SELECT DISTINCT id FROM table1 WHERE id NOT IN(SELECT id FROM table2)


RiPSO
WRInaute passionné
WRInaute passionné
 
Messages: 1591
Inscription: 4 Oct 2007

Message le Dim Nov 23, 2008 4:24

juste par hasard, tu as regardé la doc mysql : http://dev.mysql.com/doc/refman/5.0/fr/ ... ation.html

L'exemple à l'air de faire ce que tu veux à priori (je peux me tromper j'ai pas testé :mrgreen: )


screuscreu
WRInaute impliqué
WRInaute impliqué
 
Messages: 968
Inscription: 14 Jan 2008

Message le Dim Nov 23, 2008 4:35

A mon avis ça récupère pas du tout ce qu'il veut parce que là ça prends les enregistrement dans t1 qui sont aussi dans t2 ... lui il veux pas cela.

Je peux me tromper aussi mais je pense pas que ça marche


RiPSO
WRInaute passionné
WRInaute passionné
 
Messages: 1591
Inscription: 4 Oct 2007

Message le Dim Nov 23, 2008 4:55

oui tu as raison ca fait exactement l'inverse je crois. Je n'avais pas vu qu'il souhaitais les éléments non-utilisés.
Ta requete a l'air sympa donc mais il ne faudrait pas rajouter un DISTINCT pour optimiser un peu?

SELECT DISTINCT id FROM table1 WHERE id NOT IN(SELECT DISTINCT id FROM table2)

Encore une fois je ne suis pas sur, si j'ai bien compris le distinct ça fonctionne comme le group by, mais franchement ça ne fait qu'une demie heure que je sais que ça existe :mrgreen:
Je me trompe sur l'utilité du DISTINCT?


screuscreu
WRInaute impliqué
WRInaute impliqué
 
Messages: 968
Inscription: 14 Jan 2008

Message le Dim Nov 23, 2008 5:00

Moi j'avais en tête que le DISTINCT faisait perdre du temps ... je l'aurais même enlevé de ma requête parce que de base ... un id est sensée être unique donc n'a pas forcément d'utilité.

Donc mettre un DISTINCT sur la première partie de la requête: je doute de l'utilité
Mettre un DISTINCT dans la ème requete : je suis sûr qu'il sert à rien car ça va donner le même résultat... sauf si la base est foireuse et les ids sont pas uniques .... mais j'en vois pas trop l'intérêt.


RiPSO
WRInaute passionné
WRInaute passionné
 
Messages: 1591
Inscription: 4 Oct 2007

Message le Dim Nov 23, 2008 5:08

screuscreu a écrit:Moi j'avais en tête que le DISTINCT faisait perdre du temps ... je l'aurais même enlevé de ma requête parce que de base ... un id est sensée être unique donc n'a pas forcément d'utilité.

Donc mettre un DISTINCT sur la première partie de la requête: je doute de l'utilité
Mettre un DISTINCT dans la ème requête : je suis sûr qu'il sert à rien car ça va donner le même résultat... sauf si la base est foireuse et les ids sont pas uniques .... mais j'en vois pas trop l'intérêt.


Bin si le distinct c'est pareil que le group by je peux t'assurer que oui ca fait perdre du temps mais dans ta requête si les ids ne sont pas uniques et que tu as par exemple 100.000 entrées mais juste qu'une dizaine d'id différents il vaut mieux mettre le deuxième distinct je pense.

Après, j'ai demandé des trucs tellement farfelus des fois (du style une fonction dont je suis le seul sur terre à en avoir l'utilité...) que je n'émettrai même pas d'avis sur l'intérêt de cette requête :lol:


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3834
Inscription: 14 Sep 2006

Message le Dim Nov 23, 2008 8:39

DISTINCT supprime les lignes identiques, alors que GROUP BY va grouper sur les colonnes mentionnées. Ici, faire un DISTINCT sur la table TYPE_DE_LOCATION va donc accélérer le processus puisqu'il y aura moins de valeurs à comparer au final.

Code: Tout sélectionner
SELECT id FROM CLIENTS WHERE id NOT IN (SELECT DISTINCT (id_du_client) FROM TYPE_DE_LOCATION) ORDER BY id ASC


Pas besoin de distinct pour la table CLIENTS puisqu'ID est la clé primaire à mon avis, donc forcément unique. Par contre, dans TYPE_DE_LOCATION, il peut y avoir plusieurs fois un utilisateur j'imagine ?

La requête va donc commencer par executer: SELECT DISTINCT (id_du_client) FROM TYPE_DE_LOCATION
On obtient par exemple: 2,2,2,3,4,4 et après le distinct: 2,3,4

Ensuite la deuxième partie: SELECT id FROM CLIENTS WHERE id NOT IN (2,3,4)
Donc le select va aller chercher tous les id clients et les comparer avec le résultat de la première requête. Donc si id client = 1, il n'est pas dans (2,3,4) -> il le prend. S'il n'y avait pas de distinct il ferait le travail plusieurs fois pour rien en comparant chaque id client avec plusieurs valeurs identiques du tableau.
Vous êtes d'accord que c'est absurde de faire 3x d'affilé:

Est-ce que 1 == 2 ? non
Est-ce que 1 == 2 ? non
Est-ce que 1 == 2 ? non
Est-ce que 1 == 3 ? non
etc

Ton script peut être entièrement remplacé par:

Code: Tout sélectionner
<?php

include("data_bd.php");

mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir correctement remplit les donn&eacute;es du fichier data_bd.php.');

//On récupère tous les id clients inscrits qui n'ont pas posté:
$query = mysql_query("SELECT id FROM CLIENTS WHERE id NOT IN (SELECT DISTINCT (id_du_client) FROM TYPE_DE_LOCATION) ORDER BY id ASC");

while($client_sans_annonce = mysql_fetch_array($query))
{
    echo 'ID client sans annonce: '.$client_sans_annonce['id'].'<br/>';
}

mysql_close();
Dernière édition par YoyoS le Dim Nov 23, 2008 13:21, édité 1 fois.


RiPSO
WRInaute passionné
WRInaute passionné
 
Messages: 1591
Inscription: 4 Oct 2007

Message le Dim Nov 23, 2008 12:29

merci pour l'info sur le distinct, j'ai quelques scripts a modifier alors :mrgreen:


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Jeu Déc 04, 2008 13:20

Oups, je viens de retomber sur mon poste et je n'avais pas vue que d'autres réponses avait été postées :oops: .

Alors merci pour vos réponses :D d'on celle de YoyoS qui me ressort exactement ce que j'attendais :wink: .


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: Zecat et 1 invité