| Par goudo, le 16 Sep 2005, 16:08 |
Revenir en haut de page |
|
Bonjour, je suis tout nouveau chez vous donc je me permets de vous saluer haut et fort : BONJOUR. (oui je sais on a fait mieux ^^).
Je vous expose mon soucis:
ma sélection se fait sur deux tables différentes laptop et denso.
Je dois y chercher un champ qui porte le même nom dans les deux tables "ID_ENQ". Celui-ci se compose de 3 chiffres.
Le but est de récupérer ces deux champs, de les comparer et de supprimer les doublons afin de créer un <SELECT> sans avoir deux fois le même "ID_ENQ".
Je peux sans probleme tout afficher dans mon <SELECT>, ce qui n'est pas tres compliqué.
| Code: |
<?php
//requetes
$requete = mysql_query('SELECT * FROM denso');
$requete2 = mysql_query('SELECT * FROM laptop');
//ouverture SELECT
print '<select name="user">';
//BOUCLE implémentant le SELECT
while ($req = mysql_fetch_array($requete))
{
//AJOUT des choix du SELECT
print '<option>'.$req['id_enq'].'</option>';
while ($req2 = mysql_fetch_array($requete2))
{
print '<option>'.$req1['id_enq'].'</option>';
}
}
//Fermeture du SELECT
print '</select>';
|
Ma méthode peut parraitre bizarre mais elle marche. Seulement, j'ai des doublons car le même numero 'ID_ENQ' peut se retrouver dans les deux tables.
De ce fait j'aimerais les supprimer et la je bloque, j'ai tenté plusieurs méthodes avec le DISTINCT pas exemple mais j'ai de gros doutes que celui-ci fontionne sur deux champs différents qui de surcroit se trouvent dans deux tables différentes.
Auriez vous, SVP, une solution à m'apporter ?
Dernière édition par goudo le 14 Oct 2005, 13:07; édité 1 fois |
|
 |
| Par goudo, le 19 Sep 2005, 08:18 |
Revenir en haut de page |
|
Ma question est-elle trop complexe ? ou alors mal tournée ?
siouplé quelqu'un ... je cherche une petite solution  |
|
 |
| Par Cédric, le 19 Sep 2005, 10:01 |
Revenir en haut de page |
|
Salut,
Désolé du retard ! un peu pris ces derniers jours...
Pour répondre à ta question, j'aurais besoin d'un peu plus d'infos. Déjà savoir à quoi correspondent ces deux tables. Pourquoi deux tables et qu'est-ce que ce 'id_enq' ?
Donc quelles sont les infos à utiliser dans le champ select.
Je ne comprends pas non plus pourquoi la boucle sur la requête 2 est insérée dans celle de la requête 1... ?
| Citation: | | j'ai tenté plusieurs méthodes avec le DISTINCT pas exemple |
N'est-il pas possible de ne faire qu'une seule requête ?! Dis m'en plus sur tes tables et leur contenu...
Cédric |
|
 |
| Par goudo, le 19 Sep 2005, 13:03 |
Revenir en haut de page |
|
ok, donc je developpe.
"id_enq" : c'est le champ contenant un numéro unique correspondant à une seule personne.
Il se retrouve dans les deux tables car je lie le matériel à ce numéro.
A savoir qu'un "id_enq" est ajouté dans ces tables si et seulement si on ajoute du matériel à la personne.
Les tables :
-denso : elle contient donc "id_enq", le nombre de denso car un "id_enq" peut en posséder plusieurs et d'autres info sans importance ici.
-laptop : contient aussi "id_enq", "id_latop" qui correspond à l'identifiant unique d'un laptop. Un "id_enq" ne possede qu'un seul laptop.
Et d'autres info sans importance ici.
-enqueteur : c'est la seule table contenant tout les "id_enq", elle permet de verifier que celui saisi dans les tables "laptop" et "denso" existe réellement. De plus elle contient les noms des personnes.
Celle-ci n'est pas utilisée dans mon exemple, mais je pense qu'elle pourrait servir.
Explication de mes requetes dans mon exemple.
la requete 2 est insérée dans la 1 car apres avoir testé avec une seule cela ne marchait pas. En effet je n'avais que les "id_enq" qui n'apparaissaient qu'une seule fois, les doublons étaient totalement supprimés.
Le procédé que j'ai utilisé me permet de tout faire apparaitre seulement, les "id_enq" possedant 1 laptop et un/des denso(s) apparaissaient 2 fois.
ce que je tente d'obtenir
en gros j'aimerai que ma combo-box soit composée des "id_enq" trouvés dans ces deux tables mais que ceux existant dans les deux n'apparaissent qu'une fois.
Apres j'ai d'autres requetes qui une fois l' "id_enq" choisi affichent le matériel de celui-ci.
Pour info :
cette étape dans mon site fait parti de l'étape consultation.
l'insertion est déja ok.
De plus si on veut observer les densos seuls cela fonctionne, de même pour les laptops.
Seul la page permettant de faire les deux ne fonctionne pas.
Je ne sais pas si cela est plus clair, néanmoins j'ai tenté d'expliquer mes tables et ce que je cherche à obtenir
Si tu as tjs des problemes pour me comprendre (ce que je conçois^^), je tenterai d'affiner mes explications sur les points restant sombres  |
|
 |
| Par Cédric, le 19 Sep 2005, 14:55 |
Revenir en haut de page |
|
Je pense cette fois avoir bien compris (on verra en fonction du code, si c'est bien ce que tu veux )
Déjà, quelques problèmes à corriger dans tes requêtes :
| Code: | $requete = mysql_query('SELECT * FROM denso');
$requete2 = mysql_query('SELECT * FROM laptop'); |
- Il vaut mieux ne faire qu'une seule requête (ça je pense que tu le sais mais si j'ai bien compris, tu en utilises 2 à défaut d'y arriver avec une seule...)
- A moins que tu ne te serves plus loin des autres champs (?), tu n'as besoin ici que du champ id_enq. Ca ne sert à rien de tout sélectionner (SELECT *). A remplacer donc par SELECT id_enq.
- Comme tu n'as besoin que du champ id_enq, ça ne sert à rien de faire une association MYSQL_ASSOC, et encore moins MYSQL_BOTH (par défaut!). MYSQL_NUM devrait être plus rapide.
- Je ne suis pas un pro des bases de données, mais d'après tout ce que j'ai pu en lire, pour optimiser les ressources, il vaut mieux effectuer tes requêtes MySQL et fermer ta connexion juste après. Or, si tu utilises la boucle while avec ton print, tu es obligé d'insérer ta boucle au mileu de ta page (à l'endroit de ton formulaire). Donc personnellement, j'enregistrerais plutôt les champs dans une variable (en tout début de page) que j'afficherais dans le formulaire (après avoir fermé la connexion à la base, bien sûr
).
Donc, voici le code pour récupérer les ID (uniques, et triés par ordre croissant) :
| Code: | <?
// Connexion à la base de données
// et tes requêtes s'il y en a d'autres
$userlist = "";
$requete = mysql_query('SELECT id_enq FROM laptop UNION SELECT id_enq FROM denso ORDER BY id_enq');
while ($id = mysql_fetch_array($requete, MYSQL_NUM))
{
$userlist .= '<option value="'.$id[0].'"'
. ( ($_POST['user']==$id[0])?' selected':'' )
. '>'.$id[0]."</option>\n";
}
// On libère la mémoire :
mysql_free_result($requete);
// Fermer la connexion à la base !
?> |
Ensuite, tu peux utiliser $userlist (et éventuellement $_POST['user']) dans ta page :
| Code: | <label for="user">Enquêteur</label> : <select name="user">
<?= $userlist; ?>
</select> |
|
|
 |
| Par goudo, le 19 Sep 2005, 16:20 |
Revenir en haut de page |
|
je n'ai qu'une chose à dire chapeau !!
j'ai intégré ton code, ça fonctionne du feu de dieu, la fonctio UNION est magique ^^
Je te remercie grandement pour ce bout de code qui me sauve d'une torture cérébrale
Encore merci. |
|
 |
| Par Cédric, le 19 Sep 2005, 16:27 |
Revenir en haut de page |
|
Pas de quoi
Heureux d'avoir pu te soulager les neurones
Faut pas se torturer comme ça ! |
|
 |
| Par goudo, le 19 Sep 2005, 20:30 |
Revenir en haut de page |
|
bin si quand meme, c'est le seul truc sur lequel je blouquais
mais maintenant ça va ^^ |
|
 |