Besoin d'aide sur requête svp.
14 messages
• Page 1 sur 1
-

tryan - WRInaute passionné

- Messages: 2355
- Inscription: 20 Fév 2005
Besoin d'aide sur requête svp.
Bonjour,
J'essaye en vint de comparer des "id" affichés dans 2 tables afin de savoir les quelles ne sont pas utilisés.
Forcément si je poste, c'est que sa ne fonctionne pas et j'aimerais beaucoup comprendre pourquoi.
Merci
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électionner une base de donnée. Assurez vous d\'avoir correctement remplit les donné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

- Messages: 11870
- Inscription: 5 Juin 2006
A mon avis tu pourrais faire beaucoup plus simple avec not_in_array() 
-

dadovb - WRInaute passionné

- Messages: 2050
- Inscription: 22 Nov 2005
Re: Besoin d'aide sur requête svp.
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
Tes id en base ne pas des string du type :
id = 45987$id_du_client ??
-

tryan - WRInaute passionné

- Messages: 2355
- Inscription: 20 Fév 2005
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.
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

- Messages: 90
- Inscription: 20 Mai 2008
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:
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é

- Messages: 968
- Inscription: 14 Jan 2008
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)
SELECT DISTINCT id FROM table1 WHERE id NOT IN(SELECT id FROM table2)
-

RiPSO - WRInaute passionné

- Messages: 1591
- Inscription: 4 Oct 2007
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é
)
L'exemple à l'air de faire ce que tu veux à priori (je peux me tromper j'ai pas testé
-

screuscreu - WRInaute impliqué

- Messages: 968
- Inscription: 14 Jan 2008
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
Je peux me tromper aussi mais je pense pas que ça marche
-

RiPSO - WRInaute passionné

- Messages: 1591
- Inscription: 4 Oct 2007
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
Je me trompe sur l'utilité du DISTINCT?
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
Je me trompe sur l'utilité du DISTINCT?
-

screuscreu - WRInaute impliqué

- Messages: 968
- Inscription: 14 Jan 2008
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.
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é

- Messages: 1591
- Inscription: 4 Oct 2007
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
-

YoyoS - WRInaute accro

- Messages: 3834
- Inscription: 14 Sep 2006
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.
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
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électionner une base de donnée. Assurez vous d\'avoir correctement remplit les donné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.
14 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- Requete Mysql AIDE svp !
- aide svp : requete sql => MATCH() AGAINST()
- Aide php/mysql requête svp
- besoin de votre aide SVP, urgent
- Besoin d'une petite aide svp.
- [Résolu] besoin aide SVP: redirectpermanent ne fonctionne pas
- Besoin aide pour afficher légende sur requête MSQL!!
- J'ai besoin...je n'ai plus besoin de ton aide
- Aide SVP
- aide requete MYSQL
- Google API : guide de développement de l'API Google - 20-09-2002
- Nombre moyen de mots par requête : statistiques AOL Août 2006 - 10-08-2006
- Nombre de clics dans les pages de résultats : statistiques AOL Août 2006 - 11-08-2006
- La tension monte entre Google et les sites d'avis d'internautes - 01-02-2011
- Informations sur l'infrastructure technique de Google - 01-11-2004
- Le bêtisier 2008 du site WebRankInfo - 23-12-2008
- Keyword Search Engine : le choix des bons mots-clés - 09-08-2004
- Google indexe le Flash - 28-04-2004
Qui est en ligne
Utilisateurs parcourant ce forum: Zecat et 1 invité
