Left join est ce la bonne solution?

Left join est ce la bonne solution? - PHP - Programmation

Marsh Posté le 23-06-2003 à 14:22:24    

Salut:)
J'ai deux tables :
une table A
et une table  B
 
j'aimerais affiché le contenu des deux tables en même  temps lorsque A.champs=b.champs
 
Plus concrétement : une table aliment : un champs a_id , aliment et fruit_id
et dans ma table fruit: un champs f_id et un champs fruit
 
je voudrais afficher tout le contenue des aliments quand fruit_id=f_id
 
 
j'ai utlisé la fonction left join mais sans resultat :(
SELECT * FROM aliment LEFT JOIN fruit ON(aliment.fruit_id=fruit.f_id)
 
qq peut m'aider ?:(

Reply

Marsh Posté le 23-06-2003 à 14:22:24   

Reply

Marsh Posté le 23-06-2003 à 15:02:31    

te casse pas la tête avec le jargon à deux balles SQL que personne de devrait utiliser.
 
Vas-y à la bourrin comme Oracle ça marche très bien et y'a aucune différence de perfs contrairement à ce qu'on pourrait croire.
 
select a.*, b*
from a, b
where a.f_id = b.fruit_id

Reply

Marsh Posté le 23-06-2003 à 15:15:31    

dans ce cas la la même ligne de la table est répété x fois limité par LIMIT :(

Reply

Marsh Posté le 23-06-2003 à 15:30:23    

certainement pas.
 
explique ce que tu veux, parceque ma requête est bonne et ne rammène aucun doublon...

Reply

Marsh Posté le 23-06-2003 à 15:38:32    

dans le pire des cas tu met distinct apres elect pour eviter les doublons.
 
mais le left join c utile uniquement si l egalité des champs n est po toujour respecter.
 
exemple simple.
table new, et table commentaire
( il y a 0 ou X commentaire a une news )
 
si tu fais une requete du type
select news.id_news, count(commentaire.id_commentaire) from news, commentaire where news.id_news = commentaire.id_news
 
elle te donnera seulement les news qui ont au moins un commentaire.
 
alors que si tu fais
select news.id_news, count(commentaire.id_commentaire) from news left join commentaire on (news.id_news = commentaire.id_news)
tu auras toutes les news avec celles ki n ont po de commentaire.

Reply

Marsh Posté le 23-06-2003 à 16:10:24    

SELECT * FROM $table,$tab_cat where $table.cat=$tab_cat.ca_id order by n_id DESC LIMIT 20
 
vala ma requete qui m'affiche des doublons:(

Reply

Marsh Posté le 23-06-2003 à 16:14:07    

MagicBuzz a écrit :

te casse pas la tête avec le jargon à deux balles SQL que personne de devrait utiliser.
 
Vas-y à la bourrin comme Oracle ça marche très bien et y'a aucune différence de perfs contrairement à ce qu'on pourrait croire.
 
select a.*, b*
from a, b
where a.f_id = b.fruit_id


 
sous MySQL cette syntaxe est équivalente au JOIN standard


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 23-06-2003 à 17:18:25    

Sh@rdar a écrit :


 
sous MySQL cette syntaxe est équivalente au JOIN standard  


Ben oui, mais je vois pas ce qu'il veut d'autre... Y'a deuxc tables avec une clé étrangère, faut faire un join tout bêteun point c'est tout... Ou alors il explique mal son problème.
 
Déjà, si on avait une idée de la structure des tables, ça irait mieu... Et avec un petit exemple de données aussi...

Reply

Marsh Posté le 23-06-2003 à 20:24:24    

$table: champs n_id,auteur,titre,cat
cat represente l'id de ---> $tab_cat: ca_id,categorie
 
je voudrais affiché toute les news de la  maniére suivante:
CAT (correspondant au chamsp categorie quand ca_id=cat
Titre (de la table news)
Par auteur...
 
 
 
SELECT * FROM $table,$tab_cat where $table.cat=$tab_cat.ca_id order by n_id DESC LIMIT 20

Reply

Marsh Posté le 23-06-2003 à 21:02:58    

Y'a un truc qui est bien avec toi, c'est que t'es pas du tout avare en infos et explications... Je m'en fout de ce que tu veux faire, si je sais pas à quoi ressemblent tes tables et ce qu'il y a dedans ;)
 
Bon, sinon, je vois pas trop ton truc là... Finalement, t'as pris la requête que je t'ai filé... :heink:
 
Et pourquoi des fruits se sont subitement transformés en news :heink:

Reply

Marsh Posté le 23-06-2003 à 21:02:58   

Reply

Marsh Posté le 23-06-2003 à 21:12:31    

heu c'était pour faire plus facile:(
oui j'ai essayé au depart comme toi puis avec left join ...

Reply

Marsh Posté le 23-06-2003 à 21:19:36    

Donc, poste un EXEMPLE de ce que contiennent chacunes de tes tables, et un EXEMPLE de ce que tu veux au final.
 
Les tables possèdent-elles des doublons ?

Reply

Marsh Posté le 23-06-2003 à 21:23:45    

--->
$table: champs n_id,auteur,titre,cat
cat represente l'id de ---> $tab_cat: ca_id,categorie
 
je voudrais affiché toute les news de la  maniére suivante:
CAT (correspondant au chamsp categorie quand ca_id=cat
Titre (de la table news)
Par auteur...
 
 
 
SELECT * FROM $table,$tab_cat where $table.cat=$tab_cat.ca_id order by n_id DESC LIMIT 20  

Reply

Marsh Posté le 23-06-2003 à 21:27:41    

:sarcastic:
 
Y'a pas moyen d'avoir un exemple hein :o
 
Bon, ben donc cette requête est bonne.
 
select cat.categorie, news.titre, news.auteur
from $tab_cat cat, $table news
where news.cat = cat.ca_id
order by news.auteur

Reply

Marsh Posté le 24-06-2003 à 11:22:39    

BON lol:)
L'erreur ne vient pas de là , en fait j'ai créer une fonction dans laquelle je selectionne d'abord dans une table la presentation puis dans la table news les dernieres news que j'affiche avec la presentation adequate...
 
voila mon code:

Code :
  1. <?
  2. function last_news(){ //On nomme la fonction et on l'ouvre
  3. global $table; // Lezs globals c'st toujour mieux:p
  4. global $tab_membres; // Lezs globals c'st toujour mieux:p
  5. global $tab_infocat; // Lezs globals c'st toujour mieux:p
  6. global $tab_cat; // Lezs globals c'st toujour mieux:p
  7. $reket = "SELECT titre FROM $tab_infocat";
  8. $present_reket = mysql_query($reket);
  9. $present_tab=mysql_fetch_array($present_reket);
  10. $present=$present_tab[titre];
  11. $reket2=mysql_query("SELECT * FROM $table,$tab_cat where $table.cat=$tab_cat.ca_id order by n_id DESC LIMIT 20 " );
  12. while($tab_news = mysql_fetch_array($reket2))
  13. {
  14. $present=change_present($present,$tab_news);
  15. echo "$present ";
  16. }
  17. }


 
change_present est une fonction qui remaplce le contenu de $present par les bonnes variables : genre $tab_news[auteur] etc...
et quand j'affiche le resultat je n'ais que des doubkons:(

Reply

Marsh Posté le 24-06-2003 à 15:30:48    

heu :(

Reply

Marsh Posté le 24-06-2003 à 19:28:40    

du tu fais une boucle, c'est normal :heink:
 
faudrait peut-être mettre un filtre sur l'id dans la requête qui est dans la boucle...

Reply

Marsh Posté le 24-06-2003 à 21:17:37    

MagicBuzz a écrit :

te casse pas la tête avec le jargon à deux balles SQL que personne de devrait utiliser.
 
Vas-y à la bourrin comme Oracle ça marche très bien et y'a aucune différence de perfs contrairement à ce qu'on pourrait croire.
 
select a.*, b*
from a, b
where a.f_id = b.fruit_id

heu ouais m'enfin un LEFT JOIN et JOIN c'est quand même completement différent :heink:


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 24-06-2003 à 23:10:11    

Ouais, désolé, un left join (enfin, je préfère la syntaxe complète left outer join ou right outer join) c'est :
 

select a.*, b*  
from a, b  
where a.f_id = b.fruit_id(+)


 
Pas exemple, s'il y a plus d'éléments dans a que dans b
Sinon, le (+) se met à côté de f_id dans l'autre sens.
 
M'enfin vu la structure de la table, c'était tellement trivial que ce soit un inner join que je me suis pas posé la question :p
 
Avec SQL Server, on remplacera le + par une *


Message édité par MagicBuzz le 24-06-2003 à 23:11:19
Reply

Marsh Posté le 25-06-2003 à 08:45:00    

c'est bon lol;)
fallait que je mette ma premiere requete a l'interieur d ema boucle:)
 
j'ai compris pr left join $On () merci;)

Reply

Marsh Posté le 01-07-2003 à 00:12:20    

MagicBuzz a écrit :

Ouais, désolé, un left join (enfin, je préfère la syntaxe complète left outer join ou right outer join) c'est :
 

select a.*, b*  
from a, b  
where a.f_id = b.fruit_id(+)




Ca c'est une syntaxe à la oracle, c'est pas la syntaxe officielle du SQL


Message édité par joce le 01-07-2003 à 00:12:38

---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 01-07-2003 à 11:12:10    

joce a écrit :


Ca c'est une syntaxe à la oracle, c'est pas la syntaxe officielle du SQL


La syntaxe officielle est pourrie, même SQL Server et Access supprtent la syntaxe Oracle (en remplaçant le (+) pas =* ou *= :D)

Reply

Marsh Posté le 06-07-2003 à 13:34:50    

MagicBuzz a écrit :


La syntaxe officielle est pourrie, même SQL Server et Access supprtent la syntaxe Oracle (en remplaçant le (+) pas =* ou *= :D)

ouais donc c'est pas standard :kaola:
LEFT JOIN c'est très bien comme syntaxe, et ca fonctionne très bien avec MySQL :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 07-07-2003 à 17:25:01    

Ca marche très bien aussi avec SQL Server, saut que c'est purement illisible, je vomis à chaque fois que je la vois.
 
Je préfère encore faire mes jointures sans indiquer les champs de jointures, et en activant le cheminement par clés étrangères, au moins c'est pourri, mais c'est lisible. (PS: cette méthode est standard aussi, c'est pour ça qu'existe les clé étrangères à la base, avant de vérifier l'intégrité)


Message édité par MagicBuzz le 07-07-2003 à 17:25:38
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed