Page 1 sur 2

Afficher une donnée en fonction d'une autre

Posté : 05 oct. 2007, 23:33
par Snipy
Bonjoru à tous,
dans le cadre d'afficher une liste d'amis, je rencontre le problème suivant.

Je fais ma requête comme celle ci
<?php $requete = mysql_query("SELECT ami_from, ami_date, pseudo, online_id
FROM amis
LEFT JOIN membres ON id = ami_from
LEFT JOIN whosonline ON online_id = ami_from
WHERE ami_to = '".$_SESSION['id']."' AND ami_confirm = '1'
OR ami_from = '".$_SESSION['id']."' AND ami_confirm = '1'
ORDER BY ami_date, online_id DESC");
ami from étant l'id du membre qui avant lancé l'invitation et ami_to le receveur.

Mon problème arrive l'or de l'affichage
Je ne sais pas comment faire en sorte que l'on affiche le pseudo de notre ami. Car nos amis peuvent etre aussi bien ami_to que ami_from. (tout dépend si c'est moi ou lui qui avait envoyé l'invitation.

actuellement j'ai fait ceci, mais comme vous pouvez le voir c'ets uniquement le membre from.

<?php

while ($data = mysql_fetch_assoc($requete))
{
echo '<tr><td>
<a href="./voirprofil.php?id='.$data['ami_from'].'&action=consulter">
'.$data['pseudo'].'</a></td>

Donc dois je travailler sur ma requête ou par des conditions,

Merci d'avance pour votre aide

Bonne soirée

Posté : 06 oct. 2007, 04:52
par Patriboom
Je n'y verrais qu'un bête condition du genre:

$Lautre = $date['ami_to'] ? ($date['ami_from'] == $_SESSION['id']) : $date['ami_from']
echo '<tr><td>
<a href="./voirprofil.php?id='.$Lautre.'&action=consulter">
'.$data['pseudo'].'</a></td>



Posté : 06 oct. 2007, 10:02
par Tracker
Moi je modifirais l'ordre:

Code : Tout sélectionner

select _user.pseudo as user, _amis.pseudo as ami, if(_online.online_id is null, 0, 1) as online from membres _user left join ( select ami_from as uid, ami_to as aid, ami_confirm, ami_date from ami union select ami_to as uid, ami_from as aid, ami_confirm, ami_date from ami ) a on a.uid = _user.id and a.ami_confirm = '1' left join membres _amis on a.aid = _amis.id left join whosonline _online on _online.online_id = _amis.id where _user.id = <<<mysql_escape_string($_SESSION['id'])>>> order by a.ami_date, _online.online_id desc

Posté : 06 oct. 2007, 11:35
par Snipy
Je n'y verrais qu'un bête condition du genre:

$Lautre = $date['ami_to'] ? ($date['ami_from'] == $_SESSION['id']) : $date['ami_from']
echo '<tr><td>
<a href="./voirprofil.php?id='.$Lautre.'&action=consulter">
'.$data['pseudo'].'</a></td>


J'avais fait exactement ça, mais le problème ce situe pour $data['pseudo'] car il faut qu'il soit le pseudo de l'id de ta variable $Lautre.


Tracker > Si tu pouvais éclaircir ton code stp

Posté : 06 oct. 2007, 11:45
par Tracker
Tracker > Si tu pouvais éclaircir ton code stp
Ben en fait, tu remplaces ton ordre SQL, par celui que je t'ai filé,
ensuite tu sélectionnes les champs que tu souhaites, à partir des alias suivant:

_user (c'est l'enregistrement de la table membres correspondant à l'utilisateur connecté)
_amis (ce sont les enregistrements de la table membres, amis de l'utilisateurs connecté).
_online (identifiants connectés)

Par défaut je t'ai remonté le pseudo du gars connecté, les pseudos de ses amis et leur état de connexion...

ps: la partie <<<mysql_escape...>>> doit-être fabriquée en php

Posté : 06 oct. 2007, 13:04
par Snipy
Ton code légèrement modifié (3x rien) marche
Mais j'avoue que je n'arrive pas à le comprendre

<?php $requete = mysql_query("SELECT _user.pseudo as user, _amis.pseudo as ami, if(_online.online_id is null, 0, 1) as online
from  membres _user
         LEFT JOIN
         (
            SELECT ami_from AS uid, ami_to AS aid, ami_confirm, ami_date FROM amis
            union
            SELECT ami_to AS uid, ami_from AS aid, ami_confirm, ami_date FROM amis
         )  a
            ON a.uid = _user.id
            AND a.ami_confirm = '1'
         left join membres _amis
            ON a.aid = _amis.id
         LEFT JOIN whosonline _online
            ON _online.online_id = _amis.id
WHERE _user.id =".$_SESSION['id']."
ORDER BY a.ami_date, _online.online_id desc ") or die(mysql_error());

Posté : 06 oct. 2007, 13:16
par Tracker
Tu as besoin de l'explication ?

Posté : 06 oct. 2007, 13:33
par Snipy
VOila la denriere version e ce que j'ai fait
$requete = mysql_query("SELECT _user.pseudo AS user, _amis.pseudo AS ami, _amis.id AS id_ami, ami_date if(_online.online_id is null, 0, 1) as online
FROM  membres _user
         LEFT JOIN
         (
            SELECT ami_from AS uid, ami_to AS aid, ami_confirm, ami_date FROM amis
            union
            SELECT ami_to AS uid, ami_from AS aid, ami_confirm, ami_date FROM amis
         )  a
            ON a.uid = _user.id
            AND a.ami_confirm = '1'
         LEFT JOIN membres _amis
            ON a.aid = _amis.id
         LEFT JOIN whosonline _online
            ON _online.online_id = _amis.id
WHERE _user.id =".$_SESSION['id']."
ORDER BY a.ami_date, _online.online_id desc ") or die(mysql_error());
Donc c'est ton code avec une ou 2 modif, si tu pouvais expliquer ça serait super sympa.
Je pesne notamment à l'apparition de _user et _amis
Un problème par contre c'est que ça me renvoit quelque chose meme quand la table est vide

Posté : 06 oct. 2007, 13:36
par Tracker
Un problème par contre c'est que ça me renvoit quelque chose meme quand la table est vide
Laquelle ?

Posté : 06 oct. 2007, 13:38
par Snipy
Quand la table amis est vide

Posté : 06 oct. 2007, 13:40
par Tracker
Ok alors, modifie l'ordre:
$requete = mysql_query("SELECT _user.pseudo AS user, _amis.pseudo AS ami, _amis.id AS id_ami, ami_date if(_online.online_id is null, 0, 1) as online
FROM  membres _user
         INNER JOIN
         (
            SELECT ami_from AS uid, ami_to AS aid, ami_confirm, ami_date FROM amis
            union
            SELECT ami_to AS uid, ami_from AS aid, ami_confirm, ami_date FROM amis
         )  a
            ON a.uid = _user.id
            AND a.ami_confirm = '1'
         LEFT JOIN membres _amis
            ON a.aid = _amis.id
         LEFT JOIN whosonline _online
            ON _online.online_id = _amis.id
WHERE _user.id =".$_SESSION['id']."
ORDER BY a.ami_date, _online.online_id desc ") or die(mysql_error());
Je t'expliquerai le principe dès que j'aurai terminé, (je suis en train de faire le ménage :cry: )

Posté : 06 oct. 2007, 13:45
par Snipy
ça à l'air de marché merci!

Donc pex tu m'expliquer le INNER JOIN ?
et l'apparition de _user _amis stp

Merci encore !

Posté : 06 oct. 2007, 14:43
par Tracker
Alors explications:

1. Qui sont tes amis ?
Réponse: Les gens que tu références comme amis (A) + ceux qui t'ont référencé (B)
L'opérateur SQL UNION est parfait pour ce traitement:
select ami_from as (toi), ami_to as (ceux que tu références) == (A)
UNION == +
select ami_to as (toi), ami_from as (ceux qui t'ont référencé) == (B)

2. On utilise le principe des tables/vues anonymes, introduit dans mysql 4.?? en même temps
que les sous requêtes.
Explication: On peut ecrire une requête et la nommer dynamiquement pour s'en servir comme d'une vue. syntax: ( select .... ) [nom_vue]
Donc tes amis deviennent la vue suivante, nommée 'a':

Code : Tout sélectionner

( SELECT ami_from AS uid, ami_to AS aid, ami_confirm, ami_date FROM amis union SELECT ami_to AS uid, ami_from AS aid, ami_confirm, ami_date FROM amis ) a
3. Ensuite, on relie les tables:
Qui est tu ? un utilisateur connecté, donc un membre --> _user
Qui sont tes amis ? des membres -> _amis
On arrive donc à la portion de requête:

Code : Tout sélectionner

FROM membres _user INNER JOIN ( SELECT ami_from AS uid, ami_to AS aid, ami_confirm, ami_date FROM amis union SELECT ami_to AS uid, ami_from AS aid, ami_confirm, ami_date FROM amis ) a ON a.uid = _user.id AND a.ami_confirm = '1' LEFT JOIN membres _amis ON a.aid = _amis.id
4. Enfin on traite l'histoire du "online", des champs retournés, et la condition _user = session_id

ps: Tu demandais pourquoi le [inner join]. Par ce que tu veux seulement les _user qui ont des amis, cad la condition a.uid = _user.id doit éliminer les éléments de _user ne la satisfaisant pas.

Pour conclure, il faut penser SQL :wink:

Posté : 06 oct. 2007, 15:54
par Snipy
Et comment t'y prendrais tu pour afficher seulement les membres en ligne ?

Seulement en rajouter une condition dans le WHERE ?

Posté : 06 oct. 2007, 16:39
par Tracker
En faisant un inner join sur whosonline:

Code : Tout sélectionner

inner JOIN whosonline _online ON _online.online_id = _amis.id