Besoin d'aide sur requête svp.

WRInaute passionné
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:
<?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
 
WRInaute passionné
tryan a dit:
Code:
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:
 $un_client.="$id_du_client";

Donc ta requête
Code:
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
 
WRInaute passionné
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.
 
WRInaute discret
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:
//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/>';

 }
}
 
WRInaute impliqué
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)
 
WRInaute impliqué
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
 
WRInaute impliqué
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?
 
WRInaute impliqué
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.
 
WRInaute impliqué
screuscreu a dit:
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:
 
WRInaute accro
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:
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:
<?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();
 
WRInaute passionné
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: .
 
Discussions similaires
Haut