Vous n'êtes pas identifié(e).
Bonjour,
Je me posais la question: si je veux regrouper les résultats de deux requetes différentes selon un meme attribut commun, est ce que c'est possible?
Par exemple (j'utilise PDO):
1ere requete:
2eme requete:
Et voici ce que j'ai essayé de faire pour regrouper les résultats selon l'attribut "organisme":
foreach ($res as $k => $a) {
printf ('<h1>%s</h1>','<center>'.$k.'</center>');
echo '<ul>';
echo '<h2><center>Occurrences Connues:</h2></center>';
foreach ($a as $v) {
$id=substr($v,0,-1);
printf ('<li>%s</li>',"<center><"."<a href=\"http://www.lirmm.fr/~terrapon/coddDB/".$id.".html\">".$id."</a>"."></center>");
}
echo '</ul>';
echo '<h2><center>Nouvelles Occurrences:</h2></center>';
foreach ($res1 as $k1 => $a1) {
foreach ($a1 as $v1) {
if($k1==$k)
{printf('<li>%s</li>', "<center><"."<a href=\"http://www.lirmm.fr/~terrapon/coddDB/".$v1.".html\" >".$v1."</a>"."></center>");}
}
echo '</ul>';
}
}
Mais cela n'affiche pas les résultats de la 2eme requete, seulement ceux de la 1ere (quand bien meme les 2 requetes marchent individuellement) et je ne vois pas vraiment ou est l'erreur
Avez vous une idée s'il vous plait?
Merci a vous.
NdM : Attention : la balise code sur phpdebutant est [ code=...] et non [ c]
Hors ligne
Bonjour
Bien qu'il y ait des incohérences, par ex dans ta première requête, où tu fait une jonction avec une table dans laquelle tu ne récupère aucun champ à part un champ que tu as déjà avec la première table et donc tu te retrouves avec une jonction inutile*, voici la requête réunifiée sans tenir compte de ce que je viens de dire.
*PS: Sauf si tu utilises un RIGHT ou LEFT JOIN
Voila
Dernière modification par Jc (16-07-2013 18:16:48)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour
Bien qu'il y ait des incohérences, par ex dans ta première requête, où tu fait une jonction avec une table dans laquelle tu ne récupère aucun champ à part un champ que tu as déjà avec la première table et donc tu te retrouves avec une jonction inutile*, voici la requête réunifiée sans tenir compte de ce que je viens de dire.
*PS: Sauf si tu utilises un RIGHT ou LEFT JOIN
[Code=MySQL]
$Req="SELECT DISTINCTROW t1.organisme, t1.id_Prot, t2.id_Prot, t3.id_Prot
FROM PROTEINE as t1, OCC_DC as t2, OCC_NVDC_PAR_DC as t3
WHERE t1.id_Prot=t2.id_Prot AND t1.id_Prot=t3.id_Prot AND t2.id_Prot='$domaine' and t3.id_Dom='$domaine' AND t3.FDR<='$FDR'
ORDER BY t1.organisme ASC";
[/Code]Voila
Bonjour,
Je te remercie pour ta réponse.
Si j'ai fait deux requetes séparées et non pas une seule unifiée, c'est que je dois ensuite récupérer les id_Proteine de la table OCC_DC et OCC_NVDC dans l'affichage mais de maniere distincte, c'est a dire, l'id_Prot de la table OCC_DC d'une part et l'id_Prot de la table OCC_NVDC d'autre part.
Comment pourrais_je faire la distintction dans l'affichage avec une requete unifiée?
Merci encore pour ton aide.
Dernière modification par Posthume (10-05-2010 10:09:27)
Hors ligne
Vu que les id_Prot de OCC_DC et de OCC_DC sont identiques à celle de PROTEINE pour chaque enregistrement, et du moins pour ce champs la tu peux par ex faire t1.id_Prot as ID1, t1.id_Prot as ID2,t1.id_Prot as ID3 par ex sans faire appel à tes autres tables. Mais il faut voir l'ensemble et il peut malgré tout être indispensable selon les cas de maintenir ces jointures.
En l'Etat actuel des choses, et dans la requête réunifiée que je te propose la table t2 peut être retirée sans aucune incidence sur le résultat.
Dernière modification par Jc (10-05-2010 10:37:41)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Vu que les id_Prot de OCC_DC et de OCC_DC sont identiques à celle de PROTEINE pour chaque enregistrement, et du moins pour ce champs la tu peux par ex faire t1.id_Prot as ID1, t1.id_Prot as ID2,t1.id_Prot as ID3 par ex sans faire appel à tes autres tables. Mais il faut voir l'ensemble et il peut malgré tout être indispensable selon les cas de maintenir ces jointures.
En l'Etat actuel des choses, et dans la requête réunifiée que je te propose la table t2 peut être retirée sans aucune incidence sur le résultat.
Oui en effet, c'est ce que j'avais fait et dans mon code php, lorsque je fais un foreach du tableau que j'ai creé suite a ces requetes, je recupere parfaitement les id prot de OCC_DC par organisme (c'est ce que je voulais, cf mon code PHP du message précédent) mais je souhaite ajouter a cette liste, les id_Prot de la table OCC_NVDC_PAR_DC par organisme a la suite des id_Prot de la table OCC_DC mais de maniere distincte.
Dans le cas d'une requete unifiée par exemple, tu ferais comment un foreach pour parcourir les résultats de la requete pour afficher les 2 types d'id_Prot?
Merci encore.
Hors ligne
Bonsoir,
Je crois que je viens de comprendre ce que tu souhaites faire. Si j'ai bien compris, la table protéine recence toutes les proteines alors que les tables OCC_NVDC_PAR_DC et OCC_DC bien qu'elles utilisent en clé primaire la meme clé primaire de la table proteine c'est à dire l'id_prot d'une proteine, ne recensent respectivement qu'une partie des proteines contenues dans proteine, et tu souhaites lister l'ensemble des proteines contenues dans OCC_NVDC et OCC_DC classées par leur id_prot avec l'info dans quelle table des deux elles sont présentes. C'est bien ca? Je demande pour être sûr avant de travailler sur la réponse^^.
Dernière modification par Jc (10-05-2010 23:13:24)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon pensant que c'est ca ton problème, je vais t'expliquer comment le résoudre en utilisant la même technique quand on veut par exemple au sein d'une table de contacts lister les gens n'habitant pas dans la même ville, c'est à dire en faisant des jointures sur la table elle même. Bien évidemment ici tu as plusieurs tables mais vu qu'elles utilisent la même clé primaire cela revient au même.
Ton cas de figure dans ce contexte est donc un cas particulier, ou faudra traiter 3 requêtes en une seule. La premiere listera les ids existants dans les deux tables en même temps, la deuxième listera les ids existants que dans la première et pas la seconde, et la dernière listera les ids présentes dans la seconde et pas la première. Pour relier les requêtes entre elles on utilisera la commande UNION de mySQL qui à l'avantage de traiter les resultats en DISTINCT par défaut sans précision autre.
Dans ma proposition de solution, j'utilise les alias de table et de champs, car :
- Le nom de tes tables est long à écrire et source d'erreurs d'écriture
- Toutes les requêtes doivent avoir le même nombre de champs avec le même nom. Les alias de champs te permettent de les relier d'une requête à l'autre avec une colonne différente à partir du moment ou la colonne reste du même type.
Je te laisse transposer mon exemple avec tes noms de champs et tes noms de table:
En résultat tu auras quelque chose de ce genre :
A toi de récupérer les informations comme tu le souhaites à partir de la.
Bonne continuation
Dernière modification par Jc (16-07-2013 18:17:40)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonsoir,
Je crois que je viens de comprendre ce que tu souhaites faire. Si j'ai bien compris, la table protéine recence toutes les proteines alors que les tables OCC_NVDC_PAR_DC et OCC_DC bien qu'elles utilisent en clé primaire la meme clé primaire de la table proteine c'est à dire l'id_prot d'une proteine, ne recensent respectivement qu'une partie des proteines contenues dans proteine, et tu souhaites lister l'ensemble des proteines contenues dans OCC_NVDC et OCC_DC classées par leur id_prot avec l'info dans quelle table des deux elles sont présentes. C'est bien ca? Je demande pour être sûr avant de travailler sur la réponse^^.
Bonsoir Jc,
Oui c'est exactement cela dans mon cas et je te remercie pour ta réponse et tes explications tres claires. C'est vrai que l'utilisation de UNION serait tres intéressante dans mon cas, j'y ai meme pensé pour etre honnete, mais cela m'a toujours posé des problemes pour l'affichage distintif des id_Prot. Ayant reflechi a des fonctions en PHP qui pourraient m'aider a traiter ces résultats, j'ai finalement trouvé une solution qui correspond exactement a ce que je voulais faire.
Voila le code que j'ai fait:
$req_Dom_Gen1= $db->query(("SELECT DISTINCT PROTEINE.organisme, PROTEINE.id_Prot, OCC_NVDC_PAR_DC.id_Prot FROM PROTEINE, OCC_NVDC_PAR_DC WHERE OCC_NVDC_PAR_DC.id_Dom = '$domaine' AND OCC_NVDC_PAR_DC.FDR <='$FDR' AND PROTEINE.id_Prot=OCC_NVDC_PAR_DC.id_Prot ORDER BY PROTEINE.organisme ASC"));
$res = $req_Dom_Gen->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP);
$res1 = $req_Dom_Gen1->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP);
foreach($res as $k=>$a) {
printf ('<h1>%s</h1>','<center><div style="color:#FF0000;">'.$k.'</center></div>');
echo '<ul>';
echo '<h2><center><div style="color:#0000FF;">Occurrences Connues:</h2></center></div>';
foreach ($a as $v) {
$id=substr($v,0,-1);
printf ('<li>%s</li>',"<center><"."<a href=\"http://www.lirmm.fr/~terrapon/coddDB/$id.html\">$id</a>"."></center>");
}
echo '</ul>';
echo '<h2><center><div style="color:#0000FF;">Nouvelles Occurrences:</h2></center></div>';
if (array_key_exists($k, $res1)) {
foreach ($res1 as $k1 => $a1) {
foreach ($a1 as $v1) {
if ($k1==$k)
{
$id1=substr($v1,0,-1);
printf('<li>%s</li>', "<center><"."<a href=\"http://www.lirmm.fr/~terrapon/coddDB/".$id1.".html\" >$id1</a>"."></center></div>");}
}
}
}
else {
echo "<h3><center>Aucune Nouvelle Occurrence trouvee pour cet organisme. Consulter les Bd de reference de ce domaine:</h3>";
foreach ($baseRef as $BD)
{
$nomBase=$BD['Bd_Native'];
$adresseDebut=$BD['adresseWebDom_debut'];
$adresseFin=$BD['adresseWebDom_fin'];
printf('<li>%s</li>',"<center><"."<a href=\"$adresseDebut.$domaine.$adresseFin\">$nomBase</a>"."></center>");
}
}
}
En tout cas je te remercie beaucoup pour ton aide, cela m'a été tres bénéfique. A tres bientot
Hors ligne
P.S : pense à mettre ton code entre balise [ code=...] et non [ c]... Merci [j'édite ton post pour les mettre]
MERCI de lire le mode d'emploi avant de poster !!
Hors ligne
Dans le cas d'une requete unifiée par exemple, tu ferais comment un foreach pour parcourir les résultats de la requete pour afficher les 2 types d'id_Prot?
Si c'est le traitement PHP qui te pose problème voici une solution,
D'abord les données. Je pense que tu l'auras compris, OCC_NVDC_PAR_DC corresponds a table1 et OCC_DC à table2, id_prot à id (transposition de mon exemple).
L'algo de récupération des données doit être similaire à la structure de la requête avec 3 cas à traiter donc cas de présence de la prot dans les 2 tables, puis dans celle de gauche puis dans celle de droite (OCC_NVDC_PAR_DC et OCC_DC respectivement).
Je trouve ta solution compliquée alors qu'il est possible de faire beaucoup plus simple. Dans ton exemple ta table PROTEINE sert de table de base ce qui t'oblige à faire un PDO::FETCH_GROUP. Mon exemple quant à lui utilise les deux tables OCC_NVDC_PAR_DC et OCC_DC comme table unique de base (via UNION) avec une unicité des ids retournés. Suffit alors de faire une jointure de type INNER JOIN sur la table proteine pour récupérer les infos de la proteine correspondante comme suit:
la table test_main correspondant à ta table proteine et le champ name au champ organisme.
Ensuite je te propose pour plus de lisibilité dans ton code PHP d'inclure
directement dans ta requête dans tes définitions de champs.
Voici donc comment traiter par exemple ta requête en incluant ce qui précède:
Le dernier paramètre de ta fonction d'affichage te permettant de transmettre l'info sur quelle table tu travailles 0:les 2 ; 1:OCC_NVDC_PAR_DC ; 2:OCC_DC
Faudra juste vérifier n'ayant pas encore bien l'habitude de travailler avec PDO, que PDO t'envoie une valeur null de champ en PHP quand le champ mySQL est null (ce que fait mysql_query()/mysql_fetch_row()).
Ah j'oubliais.. Si tu souhaites un classement par id_prot global sur les 3 requêtes, dans l'état actuel de mon exemple ce n'est pas possible de le faire à cause des jointures. Donc pour arriver à tes fins faut rajouter un champ ayant le même nom dans les 3 requêtes sur lequel tu passes l'id non null dans les 2 dernières requetes et tu fait un ORDER BY dessus à l'exterieur de la dernière parenthèse en retirant les ORDER BY dans chaque requête.
Voila
Dernière modification par Jc (16-07-2013 18:18:18)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour Jc,
Je lis tes réponses avec beaucoup d'attention, les solutions que tu proposes sont toujours tres intéressantes et enrichissantes pour moi. Lorsque je teste ton code, voici ce que j'ai comme message:
Ce qui correspond a cette ligne:
En effet, comme tu l'as bien souligné, j'utilise PDO et les méthodes mysql ne marchent pas hélas. Meme pour tester les requetes vides, je dois passer par un foreach de la requete puis par un isset du résultat pour voir si j'ai quelque chose issu de la requete. Je suis sure qu'il y doit y avoir plus simple mais utilisant la PDO et PHP pour la 1ere fois, je pense ne pas encore avoir exploité toutes les possibilités qui s'offrent a moi. En tout cas je garde tes solutions en mémoire, je pense que je serai amené a travailler avec mysql et cela pourra donc m'etre tres utile de savoir exploiter les résultats comme tu le fais.
Par contre j'aurais une derniere question a te poser si tu veux bien:
Dans le post précédent ou j'ai écrit la solution qui regroupe toutes mes requetes par organisme:
Dans le dernier else, lorsque je dis qu'aucune nouvelle occurrence n'a été trouvé pour ce domaine dans cet organisme, je fais un foreach pour afficher un lien vers la base de donnée de référence. Or le résultat s'affiche la 1ere fois lorsqu'un organisme n'a aucune nouvelle occurrence mais je souhaiterai qu'il s'affiche a chaque fois qu'aucune nouvelle occurrence n'a été trouvée pour un organisme. D'ailleurs le message qui précéde ce foreach:
s'affiche bien a chaque fois, mais pas les résultats du foreach suivant, ce que je comprends pas.
Ma question est: est-il possible de stocker les résultats d'un foreach dans une variable de maniere a les recuperer quand on en a besoin?
Merci pour tout Jc.
PS: -j'ai tenu compte du message du modérateur.
-desolée pour l'absence de certains accents, c'est un ordinateur américain.
Hors ligne
Bonsoir, (EDIT)
Excuse moi d'abord concernant la fonction mysql, mais c'était plus pour te montrer l'algorithme de récupération et d'affichage des données que pour un test.
La fonction équivalente PDO à mon exemple mysql est
while ($row = $db_prep->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
$r_id1=$row[0];$r_id2=$row[1];$r_proteine=$row[2];
if(!is_null($r_id1) && !is_null($r_id2)){
display_prot($r_id1,$r_proteine,0);
} elseif(!is_null($r_id1) && is_null($r_id2)){
display_prot($r_id1,$r_proteine,1);
} elseif(is_null($r_id1) && !is_null($r_id2)){
display_prot($r_id2,$r_proteine,2);
}
}
function display_prot($id,$param,$table){
// Code affichage php
}
Normalement mon code avec ça doit fonctionner dans un contexte PDO (testé au cas où^^), concernant la gestion des valeurs NULL, ca fonctionne pareil avec PDO .
Concernant ton problème de for each, il faut savoir que la variable utilisée ainsi que la dernière variable de ton tableau demeurent après la boucle. Je te conseile de faire ceci:
Ce qui devrait permettre de remettre ton for each dans le même état qu'au premier passage du code à chaque passage.
A bientôt.
Dernière modification par Jc (16-07-2013 18:18:48)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Re,
J'ai oublié un cas de figure, celui où ta requête unifiée ne retourne aucun enregistrement. Donc n'oublie pas de l'inclure.;)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour Jc,
Encore et toujours merci pour ces reponses toujours aussi pertinentes Je teste immediatement ta solution et revient a toi pour te tenir informé du résultat.
PS:j'aime beaucoup ton site et la maniere dont tu l'as construit, tres joli formulaire
Hors ligne
Alors j'ai essaye ta methode car il est vrai qu'elle est beaucoup plus simple que la mienne mais voila l'erreur que je n'arrete pas d'avoir :
ce qui correspond a la ligne:
C'est frustrant. Pourtant j'a fait exactement comme tu m'as dit
Sinon c'est pas grave je vais garder ma methode, tant qu'elle marche c'est l'essentiel.
Sinon pour la solution que tu m'as propose concernant le stockage de variables d'un foreach, le probleme, c'est que je peux avoir plusieurs resultats issus du foreach et si je sors le print du foreach, je n'aurais que la 1ere valeur du foreach et non l'ensemble. C'est pour cela que je cherche a stocker les resultats dans un tableau par exemple, de facon a ce que je puisse les utiliser quand je veux tu vois ce que je veux dire?
Je vais continuer a reflechir encore un peu. Merci pour tout en tout cas, c'etait une discussion passionnante, meme s'il y a encore quelques subtilites qui m'echappent.
A tres bientot
Hors ligne
ah ca y est je n'ai plus l'erreur (j'avais oublie une parenthese ). Par contre je n'ai aucun affichage. Je pense que je dois revoir la requete reunifiee (car je suis pas tout a fait sure que cela correspond car il me faut les id_Prot de OCC_DC et de OCC_NVDC_PAR_DC classes par organisme et ou les id_Dom='$domaine') ou alors cela vient de la fonction PHP d'affichage.
Dans la fonction display_prot, tu fais un foreach sur $row[0], c'est ca?
Hors ligne
Bonjour,
^^ Non, chaque appel à la fonction corresponds à un enregistrement de ta requete, dans laquelle les champs correspondent à un parametre de ta fonction.
Ici le param $id de ta fonction corresponds à l'id_prot de la proteine en cours de lecture, j'ai utilisé le $param pour transmettre l'info PROTEINE.organisme correspondant et dans $table l'info table dans laquelle elle apparait conformément à ce que je t'ai expliqué dans un de mes posts précédents.
Entre ça dans ta fonction et regarde ce que ca donne tu comprendras mieux.
Dernière modification par Jc (16-07-2013 18:19:02)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour Jc,
Alors j'ai adapté mon code a ce que tu m'as dit mais cela ne m'affiche toujours rien
Voila ce que j'ai écrit en requete d'apres ton modele:
Mais est ce que cela ne serait pas dans mon cas quelque chose du genre:
car je veux l'id prot de OCC_DC d'une part(avec OCC_DC.id_Dom ='$domaine') et l'id_Prot de OCC_NVDC_PAR_DC d'autre part(avec OCC_NVDC_PAR_DC.id_Dom='$domaine' et OCC_NVDC_PAR_DC.FDR='$fdr') le tout classes par organisme (chaque organisme a un id de OCC_DC et/ou un id de OCC_NVDC_PAR_DC), $domaine et $fdr etant ce que l'utilisateur rentre dans le formulaire.
Hors ligne
Bonsoir,
Je reprends ce que tu as fais donc comme suit (sacré posthume^^) :
Ce qui corresponds à ce qie je t'ai donné comme infos une fois transposée dans ton cas de figure.
Maintenant reste à rajouter les conditions supplémentaires comme suit (EDIT):
Voila. J'avais bien précisé que pour avoir une requête UNION qui fonctionne il faut 1) le même nombre de champs du même type dans chaque requête 2) des noms de champs identiques dans toutes les requêtes (d'où le passage par des noms d'alias).
Tu remarqueras au passage la différence de coloration syntaxique entre ce que je viens d'écrire et ton dernier post^^
A bientôt
Dernière modification par Jc (16-07-2013 18:19:32)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Re,
concernant la sauvegarde de ton tableau de résultats suffit de le faire pendant la boucle while avec un compteur $i du style
J'oubliais, même avec la bonne requête si tu ne remplis pas ta fonction d'affichage, tu n'obtiendras qu'une page blanche en résultats^^.
A bîentôt
Dernière modification par Jc (16-07-2013 18:19:49)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour Jc,
J'ai finalement compris ce que tu faisais (cela m'a pris du temps desolee lol ^^)
Mais tu sais j'ai derriere une base de donnees tres consequente (c'est pour un grand labo) donc les requetes unifiees prennent enormement de temps (plus de 30min sur mon ordi et encore...) donc il vaut mieux dans mon cas que je passe par des requetes separees (je gagne enormement de temps ainsi, de l'ordre de 2sec par demande selon $domaine et $fdr et $organisme sur le formulaire). Je garderai les requetes unifiees pour des bases de donnees plus petite.
Donc la j'ai fait mes requetes separees, les ai mis dans un tableau que j'ai trie selon la cle organisme et cela marche vraiment super bien et c'est rapide surtout.
Sinon ta derniere intervention m'interesse car c'est le seul hic qui me pose probleme pour une petite requete que je rajoute en plus de mes resultats.
Comme tu l'auras compris, je classe les id_Proteine de la table OCC_DC et OCC_NVDC_PAR_DC en fonction de l'organisme.
Le truc, c'est qu'un id_Prot de la table OCC_DC peut aussi appartenir a la table OCC_NVDC_PAR_DC.
Donc en plus, je dois faire un test pour chaque id_Prot de la table OCC_DC, a savoir s'il appartient aussi a la table OCC_NVDC_PAR_DC.
Pour cela pas de probleme, la requete marche tres bien.
Donc si l'id_Prot appartient aux 2 tables, je fais un lien vers une page html (pour cela pas de pb non plus)
Par contre si l'id_Prot appartient que a la table OCC_DC, je fais une requete en fonction de l'organisme a laquelle il appartient pour afficher un autre lien que je recupere de la table WEB_ORGANISM et la je n'arrive a afficher que le lien du 1er organisme et pas les autres (decidement j'ai toujours le meme probleme).
Voici mon code php:
echo '<h2><center><div style="color:#0000FF;">Known Occurrences:</h2></center></div>';
//On recupere le lien de chaque organisme
$lienOrg = $db->query(("SELECT DISTINCT WEB_ORGANISM.adresseWebOrg_debut, WEB_ORGANISM.adresseWebOrg_fin
FROM WEB_ORGANISM
WHERE WEB_ORGANISM.organisme= '$k'"));
foreach ($lienOrg as $lien)
{
$adresseDebutOrg=$lien['adresseWebOrg_debut'];
$adresseFinOrg=$lien['adresseWebOrg_fin'];
}
foreach ($a as $v) { //$v est l'id_Proteine
//On teste si l'id proteine que l'on recupere contient des nouvelles occurrences
$testProtC = $db->query(("SELECT *
FROM OCC_NVDC_PAR_DC
WHERE id_Prot= '$v'"));
$nbRowC= $testProtC->rowCount();
//Si aucune occurrence, on affiche le lien de l'organisme
if ($nbRowC == 0)
{
$adresseOrg =$adresseDebutOrg.$v.$adresseFinOrg;
printf('<li>%s</li>',"<center><"."<a href=\"$adresseOrg\">$v</a>"."></center>");
}//Sinon on affiche la page html des Nouvelles Occurrences
else
printf ('<li>%s</li>',"<center><"."<a href=\"http://www.lirmm.fr/~terrapon/coddDB/$v.html\">$v</a>"."></center>");
Donc tu vois, pour chaque $v (=l'id_Prot) qui n'appartient pas aux 2 tables, j'affiche le lien $adresseOrg correspondant a l'organisme ($k) a laquel appartient $v mais j'ai du mal.
Donc a ton avis, je cree un tableau vide avant la boucle qui permet de recuperer les adresseOrg puis je remplis le tableau mais comment j'affecte la bonne adresseOrg correspondant au bon $v selon son organisme?
Vraiment desolee, j'ai du mal avec ces tableaux.
Merci pour tout.
Hors ligne
Bonjour,
Ton problème de lenteur d'éxécution de requête est très interessant pour moi en revanche^^.
Si je peux te demander un service, pourrait tu me dire entre celle que tu as déjà et les deux suivantes que je te link maintenant, laquelle des 3 est la plus rapide et si y en a une des 2 suivantes qui offre un délai de réponse satisfaisant pour toi?
$sel_qry="(SELECT t1.id_Prot AS table1, t2.id_Prot AS table2, t3.organisme AS organisme FROM OCC_NVDC_PAR_DC AS t1, OCC_DC AS t2, PROTEINE AS t3 ";
$sel_qry.="WHERE t1.id_Prot = t2.id_Prot AND t1.id_Prot = t3.id_Prot) UNION ";
$sel_qry.="(SELECT t1.id_Prot AS table1, t2.id_Prot AS table2, t3.organisme as organisme FROM OCC_NVDC_PAR_DC AS t1 LEFT JOIN OCC_DC AS t2 ON t1.id_Prot=t2.id_Prot, PROTEINE AS t3 ";
$sel_qry.="WHERE t1.id_Prot = t3.id_Prot) UNION ";
$sel_qry.="(SELECT t1.id_Prot AS table1, t2.id_Prot AS table2, t3.organisme as organisme FROM OCC_NVDC_PAR_DC AS t1 RIGHT JOIN OCC_DC AS t2 ON t1.id_Prot=t2.id_Prot, PROTEINE AS t3 ";
$sel_qry.="WHERE t1.id_Prot = t3.id_Prot)";
$sel_qry="(SELECT t1.id_Prot AS table1, t2.id_Prot AS table2, t3.organisme AS organisme,t1.id_Prot as Sel FROM OCC_NVDC_PAR_DC AS t1, OCC_DC AS t2, PROTEINE AS t3 ";
$sel_qry.="WHERE t1.id_Prot = t2.id_Prot AND t1.id_Prot = t3.id_Prot) UNION ";
$sel_qry.="(SELECT t1.id_Prot AS table1, t2.id_Prot AS table2, t3.organisme as organisme,t1.id_Prot as Sel FROM OCC_NVDC_PAR_DC AS t1 LEFT JOIN OCC_DC AS t2 ON t1.id_Prot=t2.id_Prot, PROTEINE AS t3 ";
$sel_qry.="WHERE t1.id_Prot = t3.id_Prot) UNION ";
$sel_qry.="(SELECT t1.id_Prot AS table1, t2.id_Prot AS table2, t3.organisme as organisme,t2.id_Prot as Sel FROM OCC_NVDC_PAR_DC AS t1 RIGHT JOIN OCC_DC AS t2 ON t1.id_Prot=t2.id_Prot, PROTEINE AS t3 ";
$sel_qry.="WHERE t1.id_Prot = t3.id_Prot) ORDER BY Sel Asc";
Merci par avance pour ta réponse sur ce point.
Concernant ton problème récurrent d'affichage avec ton FOREACH, tu ne m'as pas dit si la solution que je t'ai donné précédemment a fonctionné ou pas.
Si tu ne l'as pas vu, il s'agit de faire dans ton dernier exemple
de même, juste avant le } de ton foreach principal fait un unset sur tes foreach internes comme suit :
voila
à bientôt.
PS: Dans le cas où aucune des 3 requêtes venait à ne pas avoir des performances suffisantes pour les retenir, la méthode que je t'ai proposé dans le traitement des résultats en revanche, te posera moins de difficultés que la tienne et elle aura le mérite d'être plus performante moins gourmande niveau ressources que les foreach et plus facile à maintenir.
(EDIT) Le tableau que j'ai crée dans mon exemple servais juste à sauvegarder ton jeu de résultats de ta requête pour pouvoir la réutiliser plus tard dans ton code sans avoir à la relancer, pour compenser aussi ta problèmatique de non utilisation d'une boucle foreach.
Dernière modification par Jc (16-07-2013 18:20:26)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Pas de problemes pour les requetes Jc, je vais les tester de suite et je te donne le temps d'execution, s'il y en a un.
En revanche (et c'est vrai j'ai oublié de te repondre), le unset ne marche pas ni dans le 1er cas, ni dans le second.
Par exemple dans le second cas, tout marche bien, c'est a dire j'affiche la page html quand l'id_Prot appartient aux 2 tables. En revanche, lorsque l'id_Prot n'appartient qu'a la table OCC_DC, pour le 1er organisme concerné, cela affiche parfaitement les id_Prot en lien avec l'autre page $adresseOrg mais pour le second organisme concerné, cela affiche parfaitement toujours les id_Prot mais en lien avec la page $adresseOrg qui concerne le 1er organisme, donc a chaque fois, c'est le meme $adresseOrg qui est récuperé a savoir celui du 1er organisme et non celui de l'organisme en question
Idem pour le 1er cas:
seule la derniere valeur du foreach est renvoyée
PS:lorsque j'aurais un peu de temps, j'adapterai mon code a ton traitement php car comme je le disais, il me semble en effet beaucoup plus simple ^^
Hors ligne
Alors je viens d'essayer la 1ere requete sur phpmyadmin, cela a pris une bonne minute mais au final, une enorme page blanche (pas de message mysql disant "no rows" ) c'est la 1ere fois que j'ai une page comme ca qui s'affiche.
J'essaie la seconde.
Hors ligne
la second requete a ete un peu plus rapide pour donner le meme resultat a savoir une grosse page blanche. C'est byzarre. Je sais pas si cela peut t'aider. En tout cas la requete me semblait bonne. Je l'ai essaye 2 fois mais meme resultat. Si tu as besoin d'un autre test, n'hesite pas, j'ai ma bd sur mon ordi.
Hors ligne