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

Requêtes MySQL Discussion :

Requête conditionelle SQL


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Points : 17
    Points
    17
    Par défaut Requête conditionelle SQL
    Bonjour,

    J'essaye de faire une requête un peu complexe et j'aurai besoins de votre aide.
    Voici la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS `small_messages` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `sender_id` int(11) NOT NULL,
      `receiver_id` int(11) NOT NULL,
      `read` tinyint(1) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=37 ;
    Ors donc je voudrai. Récupérer toutes les entrée :
    - WHERE sender_id = 1 || receiver_id = 1
    - ORDER BY id DESC
    Jusque la c'est les doigt dans le nez.

    Maintenant le brain fuck, je voudrais limiter la cherche, pour quelle s’arrête :
    POUR la paire sender_id-receiver_id courante (attention 1-6 est une paire, 6-1 en est une autre)
    SI (sender_id = 1 OU (sender_id != 1 ET read = 1))
    EN respectant l'ordre de l'ORDER BY
    ET en gardant la ligne en question dans les résultats de la requête.

    Je sent que je vous ais perdu, si si. Alors je vais faire un exemple.
    Soit les valeur suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    id	sender_id	receiver_id	read
    1	6		1		1
    2	1		6		0
    3	1		6		0
    4	1		6		1
    5	6		1		1
    6	1		8		0
    7	1		8		0
    8	6		1		0
    Le résultât sera.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id	sender_id	receiver_id	read
    8	6		1		0
    7	1		8		0
    5	6		1		1
    4	1		6		1
    La ligne 1 n'est pas conserver car pour la ligne 5 sender_id != 1 && read = 1 , donc la recherche s’arrête pour la paire (sender_id = 6 && receiver_id = 1)
    Les ligne 2 et 3 ne sont pas conserver car pour la ligne 4, sender_id = 1, donc la recherche s’arrête pour la paire (sender_id = 1 && receiver_id = 6)
    La ligne 6 n'est pas conserver car pour la ligne 7, sender_id = 1, donc la recherche s’arrête pour la paire (sender_id = 1 && receiver_id = 8)

    J'ai l'impression que je demande la lune et toutes les étoiles qui vont avec
    Alors si votre solutions tien en plusieurs requêtes et/ou elle emplois un peut de langage de script PHP BASH etc pour faire du post-traitement, et/ou elle ne fait que la moitié de ce que je veux. C'est vraiment pas grave.

    Ma table contient vraiment beaucoup d'entrée et je voudrai limité les résultat de la requête au maximum question d'optimisation.

    Voila, voila.

    Y à t-il un courageux volontaire dans l’assistance pour lancer une idée ?

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Essaie ceci :
    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
    SELECT m1.id, m1.sender_id, m1.receiver_id, m1.read
    FROM small_messages m1
    WHERE
    (
    	sender_id = 1
    	OR
    	receiver_id = 1
    )
    AND NOT EXISTS(
    	SELECT *
    	FROM small_messages m2
    	WHERE m2.id > m1.id
    		AND
    		(
    			m2.sender_id = 1
    			OR
    			(
    				m2.sender_id <> 1
    				AND m2.read = 1
    			)
    		)
    )
    ORDER BY m1.id
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    Pas mal du tout, mais pas encore ça, car je ne récupère que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id	sender_id	receiver_id	READ
    8	6		1		0
    7	1		8		0
    En fait tout ce qu'il manque c'est de conserver première ligne trouver pour la quel sender_id <> 1 && read = 1
    C'est néanmoins bien au dessus de ce que j'ai l'habitude de faire ^^
    Au passage voila de quoi remplire la table avec l'exemple donnée plus haut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    INSERT INTO `small_messages` (`id`, `sender_id`, `receiver_id`, `read`) VALUES
    (1, 6, 1, 1),
    (2, 1, 6, 0),
    (3, 1, 6, 0),
    (4, 1, 6, 1),
    (5, 6, 1, 1),
    (6, 1, 8, 0),
    (7, 1, 8, 0),
    (8, 6, 1, 0);

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    En partant de ton idée je propose cela, qui me renvois les résultat attendu.

    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
    SELECT m1.id, m1.sender_id, m1.receiver_id, m1.READ
    FROM small_messages m1
    WHERE
    (
    	sender_id = 1
    	OR
    	receiver_id = 1
    )
    AND NOT EXISTS(
    	SELECT *
    	FROM small_messages m2
    	WHERE m2.id > m1.id
    		AND
    		(
    			(
    				m1.sender_id = 1 
    				AND m2.sender_id = m1.sender_id 
    				ANd m2.receiver_id = m1.receiver_id
    			)
    			OR
    			(
    				m2.sender_id <> 1 
    				AND m2.sender_id = m1.sender_id 
    				ANd m2.receiver_id = m1.receiver_id
    				AND m2.READ = 1
    			)
    		)
    )
    ORDER BY m1.id DESC
    Edit: J'ai tester sur ma grande table et effectuer une petite correction pour être sur que la paire de la seconde requête soit strictement la même que celle de la première. Et ça marche Enjoy, je n'y serai jamais arriver sans ton aide.

    Arg j'ai mal à la tête maintenant ><

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Simuler l'exécution d'une requête (my)sql
    Par slimane.3 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 24/05/2006, 21h16
  2. Recupérer le 1er enr d'une requète en SQL
    Par marot_r dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 31/03/2006, 22h38
  3. Interrompre une requête PL/SQL demandée par le Web
    Par PierreV01 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 12/12/2005, 10h52
  4. requête query sql
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 13
    Dernier message: 30/06/2005, 14h59
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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