IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

distincts sur deux colonnes et les mettre dans l'ordre par 2 colonnes


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Par défaut distincts sur deux colonnes et les mettre dans l'ordre par 2 colonnes
    Bonjour,


    Je vous montre ici une image de ma table dans phpMyAdmin:

    Nom : phpsql.png
Affichages : 248
Taille : 104,2 Ko

    Actuellement j'utilise ce script en php :

    MaListeDeContact("Louis") :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <?php
    $nick_me = "Louis";
     
    $sql = "SELECT * FROM messages WHERE 
    nickname_a='$nick_me' and deleting_nickname_me=''
    or
    nickname_receiver='$nick_me' and nickname_b=nickname_me and deleting_nickname_receiver=''
    or
    nickname_receiver='$nick_me' and nickname_a=nickname_me and deleting_nickname_receiver=''
    order by id desc";
    //problème
     
    $reponse = mysqli_query($bddi,$sql);
     
    $nbr = mysqli_num_rows($reponse); 
     
    $boolean = "";
    $i = 0;
    while ($donnees = mysqli_fetch_array($reponse) )
    {
    	if ( $donnees[nickname_receiver] != $nick_me ) {
    		$nick = $donnees[nickname_receiver];	
    	}
    	else {
    		$nick = $donnees[nickname_a];	
    	}
     
    ?>
    id:<?=$donnees[id]?>, from:<?=$nick?>, status:<?=$donnees[status];?>, time: <?=$donnees[timestamp];?><br>
    <?php
    }
     
    $i++;
     
    ?>

    La réponse est:

    id:51, from:Mo, status:read, time: 1472365868
    id:50, from:Mooky, status:unread, time: 1472365723
    id:49, from:Mooky, status:read, time: 1472365680
    id:48, from:Mooky63, status:read, time: 1472365670
    id:47, from:Mooky, status:read, time: 1472365625
    id:45, from:Mooky, status:read, time: 1472365344
    id:44, from:Mooky, status:read, time: 1472365333
    id:40, from:Mooky, status:read, time: 1472351004
    id:39, from:Mooky, status:read, time: 1472350940
    id:38, from:Mooky3, status:unread, time: 1472350260
    id:37, from:Mooky, status:read, time: 1472350243
    id:36, from:Mooky, status:read, time: 1472350199
    id:35, from:Mooky, status:read, time: 1472350140
    id:34, from:Mooky, status:read, time: 1472349994
    id:33, from:Mooky, status:read, time: 1472349976
    id:32, from:Mooky, status:read, time: 1472349953
    id:31, from:Mooky, status:read, time: 1472349320
    id:30, from:Mooky, status:read, time: 1472349237
    id:29, from:Mooky, status:read, time: 1472349212
    id:28, from:Mooky, status:read, time: 1472349199
    Explications :

    J'essaye de faire un système pour créer une liste de contacts à partir d'un call qui est: "MaListeDeContact("Louis")" , pour cela il faut regarder à la fois dans "nickname_me" et "nickname_receiver" pour qu'il affiche tous ces contacts.

    Les problème les voici :
    1) Il faut que le status "unread" s'affiche toujours dans les premiers, il ne faut pas de "read" entre eux (dans l'ordre avec timestamp ou id) comme avec cette ligne par exemple qui doit être tout en haut: id:50, from:Mooky, status:unread, time: 1472365723 et aussi celle ci : id:38, from:Mooky3, status:unread, time: 1472350260

    2) Il faut afficher les pseudos en "from" une seule fois sans doublons, il doit récupérer toujours le dernier status=unread les plus récents et ensuite il affiche les "read".


    Je vous montre un exemple pour mieux comprendre ce que je voudrais afficher, ceci est un montage fait à la main:

    id:50, from:Mooky, status:unread, time: 1472365723
    id:38, from:Mooky3, status:unread, time: 1472350260
    id:51, from:Mo, status:read, time: 1472365868
    id:48, from:Mooky63, status:read, time: 1472365670
    Je cherche une solution pour afficher ceci en php/mysql, est-ce quelqu'un pourrait m'aider?

    Merci.


    Table sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    -- phpMyAdmin SQL Dump
    -- version 4.0.10.14
    -- http://www.phpmyadmin.net
    --
    -- Client: localhost:3306
    -- Généré le: Dim 28 Août 2016 à 16:52
    -- Version du serveur: 5.5.50-cll
    -- Version de PHP: 5.6.20
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
    --
    -- Base de données: `espaceli_thechat`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `messages`
    --
     
    CREATE TABLE IF NOT EXISTS `messages` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `message` text NOT NULL,
      `time` text NOT NULL,
      `timestamp` text,
      `nickname_me` text NOT NULL,
      `nickname_receiver` text NOT NULL,
      `status` varchar(6) NOT NULL,
      `deleting_nickname_me` text NOT NULL,
      `deleting_nickname_receiver` text NOT NULL,
      `nickname_a` text NOT NULL,
      `nickname_b` text NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=52 ;
     
    --
    -- Contenu de la table `messages`
    --
     
    INSERT INTO `messages` (`id`, `message`, `time`, `timestamp`, `nickname_me`, `nickname_receiver`, `status`, `deleting_nickname_me`, `deleting_nickname_receiver`, `nickname_a`, `nickname_b`) VALUES
    (45, '0002', '', '1472365344', 'Louis', 'Mooky', 'read', '', '', 'Louis', 'Mooky'),
    (2, '01', '', '1472339529', 'Test', 'Mooky', 'unread', '', '', 'Test', 'Mooky'),
    (3, 'testt', '', '1472339781', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (4, 'testtt', '', '1472342897', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (5, 'testtttt', '', '1472342951', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (6, '01', '', '1472342962', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (44, 'testtt', '', '1472365333', 'Louis', 'Mooky', 'read', '', '', 'Louis', 'Mooky'),
    (8, '\nffff', '', '1472344869', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (10, 'testtt', '', '1472347777', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (11, 'p', '', '1472347781', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (12, '\nm', '', '1472347782', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (14, 'p', '', '1472347887', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (16, '\np', '', '1472347945', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (23, 'p', '', '1472348315', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (26, 'ppp', '', '1472348654', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (20, 'ppp', '', '1472348257', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (25, 'testttt', '', '1472348606', 'Test', 'Mooky', 'read', '', '', 'Test', 'Mooky'),
    (28, 'pppp', '', '1472349199', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (29, 'pp', '', '1472349212', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (30, 'ppp\n', '', '1472349237', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (31, 'pp', '', '1472349320', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (32, 'ppp\n', '', '1472349953', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (33, 'pppp', '', '1472349976', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (34, 'pppp', '', '1472349994', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (35, 'testttt', '', '1472350140', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (36, 'testtt', '', '1472350199', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (37, 'p', '', '1472350243', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (38, 'ppp', '', '1472350260', 'Mooky3', 'Louis', 'unread', '', '', 'Mooky3', 'Louis'),
    (39, 'pp', '', '1472350940', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (40, 'ppppppppppppppppppppppp', '', '1472351004', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (46, 'p', '', '1472365612', 'Mooky', 'Louis2', 'read', '', '', 'Mooky', 'Louis2'),
    (47, 'gg', '', '1472365625', 'Louis', 'Mooky', 'read', '', '', 'Louis', 'Mooky'),
    (48, 'ffffffffffffffff', '', '1472365670', 'Louis', 'Mooky63', 'read', '', '', 'Louis', 'Mooky63'),
    (49, 'mmmm', '', '1472365680', 'Mooky', 'Louis', 'read', '', '', 'Mooky', 'Louis'),
    (50, 'jjhgg', '', '1472365723', 'Mooky', 'Louis', 'unread', '', '', 'Mooky', 'Louis'),
    (51, 'testMo', '', '1472365868', 'Mo', 'Louis', 'read', '', '', 'Mo', 'Louis');
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Donc si je comprends, tu cherches à récupérer en base la ligne ayant le plus grand timestamp pour chaque nickname et trier l'ensemble des lignes récupérées par statut (unread, puis read) et par timestamp décroissant.
    C'est bien ça ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    en 2 temps (SQL, puis PHP) et après avoir corrigé les erreurs de code :
    Code hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
    $nick_me = "Louis";
     
    $sql = "SELECT * FROM messages WHERE 
    	(nickname_a='$nick_me' and deleting_nickname_me='')
    	or
    	(nickname_receiver='$nick_me' and nickname_b=nickname_me and deleting_nickname_receiver='')
    	or
    	(nickname_receiver='$nick_me' and nickname_a=nickname_me and deleting_nickname_receiver='')
    	order by status desc, timestamp desc"; // unread d'abord
     
    $reponse = mysqli_query($bddi,$sql);
    $nbr = mysqli_num_rows($reponse); 
    if($nbr>0)
    {
    	$nick_exist_array = array();
    	while ($donnees = mysqli_fetch_array($reponse) )
    	{
    		if ( $donnees['nickname_receiver'] != $nick_me ) {
    			$nick = $donnees['nickname_receiver'];	
    		}
    		else {
    			$nick = $donnees['nickname_a'];	
    		}
    		// on ne veut que les nick distincts
    		if( !in_array( $nick, $nick_exist_array ) )
    		{
    			$nick_exist_array[] = $nick; // on l'ajoute
    			// on affiche
    ?>
    	id:<?=$donnees['id']?>, from:<?=$nick?>, status:<?=$donnees['status'];?>, time: <?=$donnees['timestamp'];?><br>
    <?php
    		}
    	}
    }
    ?>

    On obtient bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id:50, from:Mooky, status:unread, time: 1472365723
    id:38, from:Mooky3, status:unread, time: 1472350260
    id:51, from:Mo, status:read, time: 1472365868
    id:48, from:Mooky63, status:read, time: 1472365670

  4. #4
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Par défaut
    Bonjour,

    Ok merci sa fonctionne bien !
    Par contre il n'est pas possible d'avoir la même chose 100% en commande sql sans utiliser php?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par mecmec Voir le message
    Par contre il n'est pas possible d'avoir la même chose 100% en commande sql sans utiliser php?
    Et tu veux 1 ou 2 sucres dans ton café ?

Discussions similaires

  1. distinct sur deux champs
    Par xzéna dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/12/2012, 16h45
  2. Utilisation de DISTINCT sur deux colonnes
    Par maydarak1 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 12/07/2012, 15h08
  3. Faire une recherche de type "contient" sur deux colonnes
    Par Sango64 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/08/2011, 10h20
  4. [Débutant] Distinct sur deux champs
    Par Machine Head dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/12/2007, 15h50
  5. Réponses: 1
    Dernier message: 26/01/2007, 20h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo