Afficher une donnée en fonction d'une autre

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Afficher une donnée en fonction d'une autre

par Snipy » 08 nov. 2007, 17:58

Bien sur :)

Par contre oublier ma première question, le problème qui me reste est juste de savoir comment afficher seulement les amis qui sont en lignes.

Code : Tout sélectionner

-- -- Structure de la table `whosonline` -- CREATE TABLE `whosonline` ( `online_id` int(11) NOT NULL, `online_time` int(11) NOT NULL, `online_ip` int(15) NOT NULL, PRIMARY KEY (`online_ip`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;

Code : Tout sélectionner

-- -- Structure de la table `amis` -- CREATE TABLE `amis` ( `ami_from` int(11) NOT NULL, `ami_to` int(11) NOT NULL, `ami_confirm` enum('0','1') character set latin1 collate latin1_general_ci NOT NULL, `ami_date` int(11) NOT NULL, PRIMARY KEY (`ami_to`,`ami_from`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin PACK_KEYS=0;
Et voici ma requete actuelle qui affichait tous mes amis :)
$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 whosonline _online
            ON _online.online_id = _amis.id 
            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());
Merci beaucoup de votre aide.

Bonne soirée

par Hubert Roksor » 08 nov. 2007, 14:14

Schéma des tables, messages d'erreur et tout le tintouin stp.

par Snipy » 08 nov. 2007, 14:10

petit up :D

par Snipy » 05 nov. 2007, 20:13

Voici ma requete actuelle

Problème : dans le tableau ou je liste mes amis, j'ai un champ ou je dis si ils sont online ou pas
		if (!empty($data['online_id'])) echo 'ONLINE'; else echo 'HORS LIGNE';
Mais ils apparaissent tous hors ligne pour l'instant :(
$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 whosonline _online
            ON _online.online_id = _amis.id 
			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()); 

Et ma seconde question : je n'arrive pas à afficher uniquement la liste de mes amis qui sont online.

Merci beaucoup et bonne soirée

par Tracker » 06 oct. 2007, 16:39

En faisant un inner join sur whosonline:

Code : Tout sélectionner

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

par Snipy » 06 oct. 2007, 15:54

Et comment t'y prendrais tu pour afficher seulement les membres en ligne ?

Seulement en rajouter une condition dans le WHERE ?

par Tracker » 06 oct. 2007, 14:43

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:

par Snipy » 06 oct. 2007, 13:45

ça à l'air de marché merci!

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

Merci encore !

par Tracker » 06 oct. 2007, 13:40

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: )

par Snipy » 06 oct. 2007, 13:38

Quand la table amis est vide

par Tracker » 06 oct. 2007, 13:36

Un problème par contre c'est que ça me renvoit quelque chose meme quand la table est vide
Laquelle ?

par Snipy » 06 oct. 2007, 13:33

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

par Tracker » 06 oct. 2007, 13:16

Tu as besoin de l'explication ?

par Snipy » 06 oct. 2007, 13:04

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());

par Tracker » 06 oct. 2007, 11:45

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