Rechercher : dans
Par :

Faire une liaison entre 2 tables MySQL.

Dernière réponse le 24 oct 2005 à 19:35:02 freeman034, le 21 oct 2005 à 15:12:39 
 Signaler ce message aux modérateurs

Salut à tous,
Bon voila je suis pas vraiment un novice en PHP je me débrouille assez bien mais là je planche sur un problème où j'ai vraiment du mal à trouver une solution, en fait j'ai fais une erreur que je ne peux pas corriger, c'est d'avoir mis des informations qui permettent de trier une requête SQL dans 2 tables différentes, donc je veux savoir si quelqu'un peut me coder les lignes pour faire la liaison entre les 2 tables (exemple : when $rang == 1 -> $nom = 2) des choses comme ça, je vous ai fais un bon p'tit résumé pour vous aider à comprendre, merci de votre aide.

Voici les tables résumées : http://p.bacquet.free.fr/tables.txt

1

crabs, le 21 oct 2005 à 16:00:43
  • +1

Salut,
Si tu débrouilles, regardes du coté des jointures de mysql, c'est le lot quotidien
de tout développeur utilsant une base de données => un petit lien :
http://dev.mysql.com/doc/refman/5.0/fr/select.html

Explique plus clairement les requètes que tu désires faire, je pas comprendre ;-)

A+, crabs ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

2

wiwimagique, le 21 oct 2005 à 16:13:13

Il suffit de faire une jointure sur tes 2 tables, les champs grade et rang sont les même si j'ai bien compris.


select machin, truc from rangs inner join users on (rangs.grade=users.rang) where rangs.grade='5' and users.user='toto'

Dans sa voiture rouge et jaune

Répondre à wiwimagique

3

freeman034, le 21 oct 2005 à 17:22:03

Oui pardon j'ai oublié de les donner :-P

$sql=mysql_query("SELECT rang, user FROM users."");
list($rang, $user) = mysql_fetch_array($sql);

$sql2=mysql_query("SELECT id, grade FROM rangs." ORDER BY id DESC");
list($id, $grade) = mysql_fetch_array($sql2);

rang = pfc, maj... (table users)
grade = pfc, maj... (table rangs)
id = 1, 2...
user = john, michael...


Idée : Sélectionner liste grades de la table rangs, ainsi que les grades assignés dans la table users, faire la laison entre les grades de users ($rang) et les grades triés numériquement de la table rangs ($grade), puis les trier grace à $id de la table rangs (de 1 à 13).
BUT : TRIER LES MEMBRES DANS UN TABLEAU DU GRADE LE PLUS ELEVE (1) AU GRADE LE MOINS ELEVE (13)


Merci pour votre aide à toutes et à tous

Répondre à freeman034

4

crabs, le 21 oct 2005 à 18:35:19

Salut,
Essayes un truc comme ça :

SELECT * FROM rangs AS r, users AS u
    WHERE r.grade= u.rang
    ORDER BY r.id

Je te conseilles vraiment d'essayer de comprendre cette requète et d'apprendre
les jointures SQL c'est la base d'une utilisation correcte d'un SGBDR.
A+, crabs ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

5

freeman034, le 21 oct 2005 à 18:54:57

Salut Crab,
Non je n'arrive pas à trouver la combinaison qui aille...

Je pense que la ligne de code précédente irait mieux :

select machin, truc from rangs inner join users on (rangs.grade=users.rang) where rangs.grade='5' and users.user='toto'


J'ai bien lu sur le site de MySQL mais je comprends toujours pas... je te passe la ligne de code qui doit être officiellement incorporée tu peux me l'adapter stp car moi j'ai tjrs une erreur...

$sql2=mysql_query("SELECT pseudo, mail, icq, msn, aim, yim, rang, country, url, abrev FROM users WHERE niveau>1 AND team='$team' ORDER BY niveau DESC");
$nb_members = mysql_num_rows($sql2);


Merci infiniment, c'est urgent !

Répondre à freeman034

6

crabs, le 21 oct 2005 à 20:46:11

Salut,
Le mieux c'est tu files via un fichier accessible sur le net (comme au 1er post)
les structures de tes tables, queiques lignes de ces même tables,
les données qui vont servir de critères à la realistion de ta requette et
le resultat que tu escomptes.
Et comme l'urgence n'attend pas, dès que tu auras donné ces infos très
précisément, j'essaierai de voir si je peux t'aider pour cette requette.
A+, crabs ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

7

freeman034, le 23 oct 2005 à 03:42:38

Salut Craps,
Est-ce que tu as un Messenger avec lequel je peux te parler en direct stp ? Merci

Répondre à freeman034

8

crabs, le 23 oct 2005 à 09:02:42
  • +1

Perso moi c'est crabs.
Désolé, mais uniquement par le biais du forum. ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

9

freeman034, le 23 oct 2005 à 18:00:22

Salut Crabs,
Excuses-moi d'avoir écorché ton nom.

En fait voici la vraie ligne que je viens de faire mais visiblement elle marche pas, tu peux me la corriger stp ?

$sql=mysql_query("SELECT ordre, grade FROM nuked_rangs inner join nuked_users on (nuked_rangs.grade=nuked_users.url) where users.url!='' ORDER BY ordre DESC");

Répondre à freeman034

10

crabs, le 23 oct 2005 à 18:11:57
  • +1

No problemo ;-)

Je vais avoir l'air de me répéter, mais perso je ne connais pas le contexte de
ton appli, je veux bien t'aider si tu donnes des infos précises :
- structure des tables
- quelques lignes
- le résultat escompté avec ces quelques lignes.
Pour des applis dont je connais le modèle de données il me faut parfois
plusieurs jours avant de trouver la requète correcte, alors c'est pas avec le
peu d'info que tu donnes que tu auras de l'aide.

Typiquement dans ton dernier POST tu met un critère de selection qui est url
issu de la table users, mais dans ton lien http://p.bacquet.free.fr/tables.txt et
je ne vois pas ce champ.
Perds un peu de temps à refaire un fichier tables.txt et à exprimer ce que tu
cherches à faire. J'essaierai dans la mesure de mes moyens de te répondre.

Dans l'attente de quelques précisions, crabs ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

11

freeman034, le 23 oct 2005 à 19:01:16

Salut Crabs,
Voila donc ce que tu m'as demandé, j'ai fais une capture d'écran pour les 2 tables cibles, et il faut donc lier les colonnes "url" et "grade" pour montrer que c'est les memes et faie un ORDER BY ordre DESC pour trier du grade le plus élevé au plus bas, je t'ai mis une portion du script dans le fichier texte. Les voici :

http://p.bacquet.free.fr/rangs.jpg
http://p.bacquet.free.fr/users.jpg
http://p.bacquet.free.fr/script_team.txt

Merci pour ton aide !

Répondre à freeman034

12

crabs, le 23 oct 2005 à 19:37:05
  • +1

Salut,

SELECT * FROM nuked_users AS u, nuked_rangs AS r
  WHERE u.url = r.grade
  ORDER BY r.id DESC

Tu peux aussi compléter la clause WHERE avec des AND
Exemple, la même requete mais seulement si l'url de rangs est rempli
SELECT * FROM nuked_users AS u, nuked_rangs AS r
  WHERE u.url = r.grade
     AND r.url <> ''
  ORDER BY r.id DESC

Allez, une petite dernière, imaginons que tu es un code équipe dans
la table users (nom de champ team_id) et que tu désires obtenir le résultat
pour la team de code 8 :
SELECT * FROM nuked_users AS u, nuked_rangs AS r
  WHERE u.url = r.grade
     AND u.team_id = '8'
  ORDER BY r.id DESC

A+, crabs ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

13

freeman034, le 23 oct 2005 à 21:22:10

Salut Crabs,
Je n'y arrive toujours pas... Voici la ligne de code que j'ai mise :

	$sql2=mysql_query("SELECT pseudo, mail, icq, msn, aim, yim, rang, country, url, abrev FROM nuked_users AS u, nuked_rangs AS r WHERE u.url = r.grade AND u.niveau>1 AND u.team = $team ORDER BY r.id DESC");
	$nb_members = mysql_num_rows($sql2);


Et voici une image du résultat :

http://p.bacquet.free.fr/roster_trouble.jpg

J'ai tout essayé de par mes connaissances et je vois toujours pas... merci pour ton aide.

Phil

Répondre à freeman034

14

freeman034, le 24 oct 2005 à 00:49:48

Salut encore,
J'ai avancé, maintenant la query marche et les résultats s'affichent mais tjrs en desordre.

J'ai été voir dans MySQL j'ai exécuté la query et il s'avère que la demande de ORDER BY n'est pas prise en compte, j'ai essayé avec d'autres colonnes et ça marche pourtant... alors pourquoi ça marche pas avec cette colonne "id" ?

Voici la ligne de FETCH :

SELECT u.pseudo, u.mail, u.icq, u.msn, u.aim, u.yim, u.rang, u.country, u.url, u.abrev, r.grade, r.id FROM nuked_users AS u, nuked_rangs AS r WHERE u.url = r.grade AND u.niveau>1 AND u.team = 2 ORDER BY r.id DESC

Merci pour l'aide

Répondre à freeman034

15

crabs, le 24 oct 2005 à 05:47:05
  • +2

Quel est le type de ton champ id dans la table nuked_rangs ? ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

16

freeman034, le 24 oct 2005 à 18:48:48

Salut Crabs,
Le champs "id" est le suivant :

id varchar(20) latin1_general_ci No

Répondre à freeman034

17

crabs, le 24 oct 2005 à 19:13:35
  • +1

Salut,
Pour que le tri fonctionne, ll faut mettre un type entier sur ce champs. ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

18

freeman034, le 24 oct 2005 à 19:20:59

Qu'entends-tu par "entier" stp ? :-)

Répondre à freeman034

19

crabs, le 24 oct 2005 à 19:33:16
  • +1

Un type de TINYINT à BIGINT.
http://dev.mysql.com/doc/refman/5.0/fr/numeric-types.html
-> fin de la page ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

20

 freeman034, le 24 oct 2005 à 19:35:02

Yessssssssssssss ça y est ça marche je l'ai mis en int(4) et c'est impec MERCI INFINIMENT CRABS que Dieu te bénisse merci encore j'aurais jamais réussi sans ta précieuse aide.

Phil

Répondre à freeman034