Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1985 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] requéte multi table

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] requéte multi table

n°1747732
sebinfo007
Posté le 17-06-2008 à 17:44:49  profilanswer
 

bonjour à tous,
 
voila j'ai fait un champ de recherche sur mon site et la recherche doit s'executer sur plusieurs table :
 

Code :
  1. <?php
  2. //on définit la variable du formulaire de recherche
  3. error_reporting(0);
  4. $recherche = $_POST['nom_rechercher'];
  5. //si $recherche existe exécution du script
  6. if ($recherche){
  7. //on créer un tableau mots qui va contenir chaque mot saisi dans le champ recherche : un mot = un enregistrement du tableau
  8. //explode definit que chaque espace taper dans le champ recherche est un separateur  
  9. $mots = explode(" ",$recherche);
  10. //définition de la requête sql qui s'execute en boucle puisque id ne sera jamais null
  11. $sql = "SELECT * FROM `2008`
  12.         WHERE ";
  13. //on créer un boucle qui parcours le tableau mots et qui execute la requete pour chaque enregistrement du tableau
  14. for($i=0;$i < count($mots); $i++)
  15. {
  16. $mot = trim($mots[$i]);
  17. $sql .= " (NOM LIKE '%$mot%')";
  18. }
  19. //éxecution de la requête
  20. $req = mysql_query($sql) or die ('Erreur SQL : '.mysql_error());
  21. echo "<h3>Resultat de la recherche</h3>"; ?>
  22. <form method="post" name="modif" action="modif.php">
  23. <?php
  24. //affichage des résultats  
  25. while ($data = mysql_fetch_array($req))
  26. {
  27. $Nom = $data['NOM'];
  28. $Prenom = $data['PRENOM'];
  29. $Numero = $data['NUMERO'];
  30. $id = $data['ID'];
  31. echo"";
  32. echo "<fieldset>";
  33. echo "Nom : $Nom<br/>
  34. Prénom : $Prenom<br/>
  35. Numéro : $Numero <br/>";
  36. echo '<input type="radio" name="selid"  value="', $Numero, '" />';
  37. echo"</fieldset> <br/>";
  38. }
  39. }
  40. ?>
  41. <input type="submit" value="Valider" /></form>


 
dans la requéte SQL je lui demande de chercher dans la table 2008 mais je voudrais qu'il cherche aussi dans la table 2009 et 2010..
 
Comment faire ?
 
merci à vous.
 
Sébastien

mood
Publicité
Posté le 17-06-2008 à 17:44:49  profilanswer
 

n°1747737
anapajari
s/travail/glanding on hfr/gs;
Posté le 17-06-2008 à 17:53:05  profilanswer
 

péter la gueule de la personne qui a fait le MPD, rajouter un champs année dans la table et centraliser tous les enregistrements dans cette table.


---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1747745
sebinfo007
Posté le 17-06-2008 à 18:05:08  profilanswer
 

ça me parait un peu brutal !
 
mais plus techniquement tu peux m'expliquer comment réaliser tout ça ?
 
merci ! :)

n°1748030
anapajari
s/travail/glanding on hfr/gs;
Posté le 18-06-2008 à 10:29:11  profilanswer
 

A vue de nez, tu as des tables qui ont la structure suivante:
nom: 200X
champs:

  • ID
  • Nom
  • Prenom
  • Numero

Avec une table par année donc.

 

Et bien à la place tu créés une table TOTO comme ça

  • ID
  • Année
  • Nom
  • Prenom
  • Numero

Et si tu as besoin d'une seule année tu rajoutes une condition dans ton select sur ce champs.

 

Du coup ton problème initiale devient:

Code :
  1. SELECT ID, Nom, Prenom, Numero FROM TOTO WHERE ANNEE BETWEEN 2008 AND 2010 AND (  NOM LIKE '%mot1%' OR ... OR NOM LIKE '%mot2%')
 


Maintenant c'est pas encore parfait car tu vas vite avoir des doublons ( genre Pierre Dupont sur plusieurs années).
Le mieux sera donc de faire 2 tables:
Table Personne:

  • id
  • nom
  • prenom
  • numero

Table Inscription (je sais pas ce que tu gères, c'est au pif ce nom)

  • id
  • idPersonne
  • annee

Ta requête deviendrait alors:

Code :
  1. SELECT
  2.  p.id,
  3.  p.nom,
  4.  p.prenom,
  5.  P.numero
  6. FROM
  7.  Personne P
  8.  INNER JOIN Inscription ON p.id = idPersonne
  9. WHERE
  10.     annee BETWEEN 2008 AND 2010
  11. AND ( nom LIKE '%mot1%' OR ... OR nom LIKE '%mot2%')
  

Si c'est pour un site internet, je te conseille également de te pencher sur les problèmes de SQL injection


Message édité par anapajari le 18-06-2008 à 10:33:48

---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1748039
sebinfo007
Posté le 18-06-2008 à 10:51:07  profilanswer
 

trés interessant tout ça ! en fait j'ai fait un petit systéme d'inscription pour les patients de ma clinique. Les secrétaire médicales de l'établissement rentre le nom et le prénom et ça affecte automatiquement un numéro. Ce numéro est composé de YYYYMM-ID+1 ex : 200806-125
 
je vais t'expliqué pourquoi je fais une table par année. pour pouvoir incrémanter de 1 à chaque fois que les secrétaires rentre un nom et pour éviter d'avoir des doublons je me sers de l'autoincrémante de mon ID donc à chaque fois qu'elle rentre un patient je vérifie le dernier ID en cours je rajoute 1 et je l'intègre dans mon champ NUMÉRO. Donc tout ça marche très bien sauf pour la recherche c'est là que je demande de l'aide.
 
J'avais bien pensé à ne faire qu'une table avec l'année mais comment avoir un numéro qui s'incrémente de +1 à chaque nouvel enregistrement ?
 
et il fallait que chaque année ça reparte à 1 ! donc trés pratique de créer une table à chaque année

Message cité 1 fois
Message édité par sebinfo007 le 18-06-2008 à 10:52:28
n°1748060
anapajari
s/travail/glanding on hfr/gs;
Posté le 18-06-2008 à 11:17:48  profilanswer
 

Tout ça traduit juste une méconnaissance du fonctionnement d'un SGBD et de l'utilisation de SQL en général.

sebinfo007 a écrit :

trés interessant tout ça ! en fait j'ai fait un petit systéme d'inscription pour les patients de ma clinique. Les secrétaire médicales de l'établissement rentre le nom et le prénom et ça affecte automatiquement un numéro. Ce numéro est composé de YYYYMM-ID+1 ex : 200806-125


Super, donc si je viens le 25 mars pour me faire enlever 2 dents de sagesse et que je reviens 1 semaine plus tard pour en enlever 2 autres, je me retrouve avec 2 numéros?
Et si je fais cela a cheval sur 2 années, je me retrouve avec 2 numéros dans 2 tables différentes?

sebinfo007 a écrit :

je vais t'expliqué pourquoi je fais une table par année. pour pouvoir incrémanter de 1 à chaque fois que les secrétaires rentre un nom et pour éviter d'avoir des doublons je me sers de l'autoincrémante de mon ID donc à chaque fois qu'elle rentre un patient je vérifie le dernier ID en cours je rajoute 1 et je l'intègre dans mon champ NUMÉRO. Donc tout ça marche très bien sauf pour la recherche c'est là que je demande de l'aide.


Sauf que tu confonds identifiant ( la clé "technique" qui te permet de retrouver un enregistrement dans ta table ) et numéro ( la clé "métier" qui te permet de retrouver un patient dans ta clinique).

sebinfo007 a écrit :

J'avais bien pensé à ne faire qu'une table avec l'année mais comment avoir un numéro qui s'incrémente de +1 à chaque nouvel enregistrement ?


Une autre question serait : "Pour quelle raison avez vous besoin d'un numéro?" l'identifiant technique ne serait-il pas suffisant? La notion de année/mois dans le numéro a-t-elle une utilité ou bien c'était comme ça avant alors il faut que ça reste comme ça?
Quoi qu'il en soit, il y a moultes façons de faire autrement. Mais le choix dépend du besoin exact.

sebinfo007 a écrit :

donc trés pratique de créer une table à chaque année


Non c'est de la merde...
La seule raison qui pourrait pousser "eventuellement" à ça serait la volumétrie des données, mais même dans ce cas là on ne créé pas plusieurs tables mais un partionnement.


Message édité par anapajari le 18-06-2008 à 13:26:15

---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1748107
Alisteroid
Posté le 18-06-2008 à 13:23:28  profilanswer
 

Putain le modèle de base de donnée  [:flu1]  

n°1748113
sebinfo007
Posté le 18-06-2008 à 13:32:47  profilanswer
 

hum bon je vais tout expliqué du fonctionnement :
 
Ce systéme ne gére que le numéro attribué à un nouveau patient si le patient est déjà venu on le cherche dans notre logiciel métier et donc pas besoin de passer par mon script.
 
mon script ne sert qu'a attribuer un numéro à un nouveau patient qui n'est jamais venu.
 
le champ recherche est là au cas dans notre logiciel métier le numéro qui aurait du être attribué à été oublié auquel cas on passe par mon script on recherche le nom du patient et là on a le numéro. et on l'intégre au logiciel métier.
 
donc voila je cherche à créer un script qui me permettrait d'attribué un numéro unique à un patient avec une fonction recherche...

n°1748222
anapajari
s/travail/glanding on hfr/gs;
Posté le 18-06-2008 à 15:15:40  profilanswer
 

Citation :

donc voila je cherche à créer un script qui me permettrait d'attribué un numéro unique à un patient avec une fonction recherche...


Bon à partir de ton bout de code, je deduis que tu utilises mysql. Sur ce coup là, c'est pas forcément le meilleur choix car ce SGBD ne gère pas les séquences. Mais on va ruser...
Tu fais un table "patients" comme ça:

Code :
  1. CREATE TABLE `test` (
  2.  `id` int(11) NOT NULL AUTO_INCREMENT,
  3.  `nom` varchar(30) NOT NULL,
  4.  `prenom` varchar(30) NOT NULL,
  5.  `dateEntree` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  6.  `numero` varchar(30) NOT NULL,
  7.  PRIMARY KEY  (`id`)
  8. )


Et quand tu veux insérer un personne tu fais ça:

Code :
  1. INSERT INTO test (nom, prenom, numero)
  2. SELECT 'toto', 'tata', concat( date_format( now(), '%Y%m-' ) , coalesce( count( * ) , 0 )+1)
  3. FROM test
  4. WHERE year( dateEntree ) = year( now( ) )


En remplaçant toto et tata par les valeurs que tu veux.

 

Tu n'auras alors qu'une table pour tous tes numéros et la recherche ne devrait plus te poser de problème.

 

<mode aparté>

sebinfo007 a écrit :

hum bon je vais tout expliqué du fonctionnement :
Ce systéme ne gére que le numéro attribué à un nouveau patient si le patient est déjà venu on le cherche dans notre logiciel métier et donc pas besoin de passer par mon script.
mon script ne sert qu'a attribuer un numéro à un nouveau patient qui n'est jamais venu.


Juste pour être sur de bien comprendre, admettons je me rends dans ta clinique.
Receptioniste: "Bjr monsieur vous êtes déjà venu?"
Moi: "Non"
R: "Attendez je vous créé un numéro de dossier"

  • etape 1: création d'un numéro unique dans ton outil
  • etape 2: création du dossier "patient" dans le logiciel métier avec le-dit numéro

Autre cas:
receptioniste: "Bjr monsieur vous êtes déjà venu?"
Moi: "oui"
R: "Attendez je cherche votre numéro dans notre logiciel métier, alalala je le trouve pas ... l'informatique alors ... attendez je vais le chercher dans un autre outil (le tien) ... ça y est je l'ai".

 

Loin de moi l'idée de critiquer gratuitement ( car j'imagine très bien qu'il y a moultes contraintes dont tu ne nous a pas parler) mais tout de même, il semble possible de bien optimiser votre SI :o

 

</mode aparté>

 



Message édité par anapajari le 18-06-2008 à 15:16:12

---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1748258
sebinfo007
Posté le 18-06-2008 à 15:41:05  profilanswer
 

Alors déjà ça ne fonctionne pas tout à fait comme ça on reçoit des dossiers, les patients ne viennent pas à l'accueil comme ça pour être hospitalisé. tout ce que je t'ai expliqué est en amont, nous somme un centre de rééducation.
 
et la création du numéro unique n'est pas fait à l'accueil mais par les secrétaires médicales qui sont 4. donc c'est 4 personnes qui ont chacune besoin d'un numéro unique à un instant T. le numéro que je génére est un numéro IPP c'est un numéro d'archive.
 
Chaque patient doit avoir un numéro IPP et pour éviter qu'il soit donné aléatoirement j'ai fait cet outil. Ce script ne sert qu'a avoir un numéro pour un nouveau patient. Notre logiciel métier qui est un ERP gére le dossier patient de AàZ
 
mon champ de recherche c'est dans la faible propabilité ou la secrétaire à oublié de reporter le numéro dans le dossier du patient.
 
mais je te rassure tout est bien ficelé.
 
Merci à toi


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] requéte multi table

 

Sujets relatifs
SQL Server : Importer colonne de T1 dans une colonne de T2Requête Sql avec variable PHP
cree une relation entre deux table access en code vb6[ORACLE - TRIGGER]exception TABLE IS MUTATING
besoin d'aide (avant 15h :/) requete SQL compliquéecrees plusieur table access en vb6
[SQL Server] Capacité et temps d'exécutionPb de temps d'execution d'une requete
Plus de sujets relatifs à : [SQL] requéte multi table


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR