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

Langage SQL Discussion :

Identifiant de l'image précédente


Sujet :

Langage SQL

  1. #1
    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 Identifiant de l'image précédente
    Bonjour,

    Soit la table suivante :
    te_image_img (img_id, img_id_proprietaire, img_id_type, img_fichier, img_date, img_titre)

    Je cherche l'image précédente de celle affichée, du même type et du même propriétaire.

    J'ai fait cette requête qui fonctionne mais je la trouve un brin compliquée a a priori.

    Y'aurait pas plus simple ?
    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
    SELECT img_id
    FROM te_image_img
    WHERE img_id_type = 3
    	AND img_id_proprietaire = 16
    	AND img_date = 
    	(
    		-- Date de l'image précédente du même type et du même propriétaire
    		SELECT MAX(img_date) AS date_prec
    		FROM te_image_img
    		WHERE img_id_type = 3
    			AND img_id_proprietaire = 16
    			AND img_date < 
    			(
    				-- date de l'image actuelle
    				SELECT img_date
    				FROM te_image_img
    				WHERE img_id = 4
    			)
    	)
    Surtout que je n'ai pas directement le img_id_proprietaire et qu'il faudrait en fait que je fasse ainsi :
    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 img_id
    FROM te_image_img
    WHERE img_id_type = 3
    	AND img_id_proprietaire = 
    	(
    		SELECT img_id_proprietaire
    		FROM te_image_img
    		WHERE img_id = 4
    	)
    	AND img_date = 
    	(
    		-- Date de l'image précédente du même type et du même propriétaire
    		SELECT MAX(img_date) AS date_prec
    		FROM te_image_img
    		WHERE img_id_type = 3
    			AND img_id_proprietaire = 
    			(
    				SELECT img_id_proprietaire
    				FROM te_image_img
    				WHERE img_id = 4
    			)
    			AND img_date < 
    			(
    				-- date de l'image actuelle
    				SELECT img_date
    				FROM te_image_img
    				WHERE img_id = 4
    			)
    	)
    Utilisant MySQL, je pourrais jouer avec LIMIT de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT i.img_id
    FROM te_image_img i
    INNER JOIN te_image_img i2
    	ON i2.img_id_proprietaire = i.img_id_proprietaire
    	AND i2.img_id_type = i.img_id_type
    WHERE i2.img_id = 4 -- image actuelle
    	AND i.img_date < i2.img_date
    ORDER BY i.img_date DESC	
    LIMIT 1
    Mais je me demande si, avec un grand nombre d'images, les performances ne vont pas se dégrader plus vite qu'avec la première requête.

    Et comme j'utilise MySQL, pas de ROW NUMBER OVER PARTITION non plus !
    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 !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Une idée comme ça: l'image précédente, c'est celle pour laquelle:
    1. la date est antérieure à celle de l'image courante,
    2. il n'existe pas d'autre image ayant une date postérieure, et antérieure à celle de l'image courante.
    Un truc du style:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select ip.*
    from image ip
    inner join image ic on ic.type = ip.type and ic.proprio = ic.proprio and i.date > ip.date
    left outer join image as in on in.type = ic.type and in.proprio = ic.proprio and in.date between ip.date and ic.date
    where in.proprio is null
    ip représente l'image courante, ip l'image précédente et in celle "qui n'existe pas".
    Reste à voir ce que ça donne avec Mysql.

    Tatayo

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Comme ça ? (à vérifier)
    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
    SELECT  cur.img_id  courant
        ,   prc.img_id  précédent
    FROM    te_image_img    cur
        LEFT JOIN
            te_image_img    prc
            ON  cur.img_id_proprietaire = clc.img_id_proprietaire
            AND cur.img_id_type         = clc.img_id_type
            AND EXISTS
                (   SELECT  NULL
                    FROM    te_image_img    clc
                    WHERE   prc.img_id_proprietaire = clc.img_id_proprietaire
                        AND prc.img_id_type         = clc.img_id_type
                        AND cur.img_date    > clc.img_date
                    HAVING  prc.img_date    = MAX(clc.img_date)
                )
    ;
    NB : J'ai ajouté une jointure externe au cas où il n'y ait pas de précédent
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    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
    Pour le moment, j'ai adopté ma requête avec LIMIT. On verra à l'usage si les performances se dégradent, on a le temps.
    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 !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH T AS 
    (
    SELECT *, ROW_NUMBER(OVER PARTITION BY img_id_proprietaire, img_id_type 
                         ORDER BY img_date DESC) AS N
    FROM   te_image_img
    )
    SELECT *
    FROM   T
    WHERE  NCHAR = 2;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    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
    Merci Fred mais malheureusement, comme dit dans mon premier message :
    Citation Envoyé par CinéPhil
    Et comme j'utilise MySQL, pas de ROW NUMBER OVER PARTITION non plus !
    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 !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Ben, change de SGBDR !!! ;-)

    Désolé, j'ai pas résisté...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    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
    Si je pouvais !
    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 !

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    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
    SELECT *
    FROM
    (       
    SELECT T1.img_id, T1.img_id_proprietaire, T1.img_id_type, 
           T1.img_fichier, T1.img_date, T1.img_titre, 
           COUNT(*) AS N
    FROM   te_image_img AS T1
           INNER JOIN te_image_img AS T2
                 ON T1.img_id_proprietaire = T2.img_id_proprietaire
                    AND T1.img_id_type = T2.img_id_type
                    AND T1.img_id >= T2.img_id
    GROUP BY T1.img_id, T1.img_id_proprietaire, T1.img_id_type, 
           T1.img_fichier, T1.img_date, T1.img_titre
    ) AS T
    WHERE  N = 2
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/11/2011, 20h59
  2. Image précédente qui s'affiche toujours
    Par ziseb dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 02/08/2011, 16h11
  3. Récupérer l'identifiant d'une image
    Par mayya1987 dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 06/04/2011, 00h49
  4. Sur survole modification image précédente
    Par 12_darte_12 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/12/2006, 16h02
  5. enregistrer une image et un identifiant
    Par dosach dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/03/2004, 17h18

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