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 :

Extraire plusieurs champs d'une table dans une même requête


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut Extraire plusieurs champs d'une table dans une même requête
    Bonjour,

    via une requête SQL, je souhaite afficher une liste des derniers articles ainsi que leurs versions multilingues respectives, Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while 
    {
    	article per defaut (fr)
    	|_ link to translation en
    	|_ link to translation de
    	|_ link to translation es
    }
    Voici la requête SQL que j'ai essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(articles.date) AS DATE
    	FROM articles
    JOIN translations ON articles.id = translations.art_id
    	GROUP BY translations.art_id
    ORDER BY DATE DESC
    	LIMIT 10
    Et le schéma des tables 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
    Schemas table languages
    +-----------------+----------------------+------+-----+---------+----------------+
    | Field           | Type                 | Null | Key | Default | Extra          |
    +-----------------+----------------------+------+-----+---------+----------------+
    | id              | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
    | lang       	  | varchar(2)           | NO   | UNI | NULL    |                |
    +-----------------+----------------------+------+-----+---------+----------------+
     
    Schemas table articles
    +-----------------+----------------------+------+-----+---------+----------------+
    | Field           | Type                 | Null | Key | Default | Extra          |
    +-----------------+----------------------+------+-----+---------+----------------+
    | id              | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
    | date       	  | datetime             | NO   |     | NULL    |                |
    +-----------------+----------------------+------+-----+---------+----------------+
     
    Schemas table translations
    +-----------------+----------------------+------+-----+---------+----------------+
    | Field           | Type                 | Null | Key | Default | Extra          |
    +-----------------+----------------------+------+-----+---------+----------------+
    | id              | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
    | art_id	      | smallint(5) unsigned | NO   |     | NULL    |                |
    | lang_id         | int           		 | NO   |     | NULL    |                |
    | permalink       | varchar(255)         | NO   | UNI | NULL    |                |
    | title           | varchar(255)         | NO   | UNI | NULL    |                |
    | caption         | text                 | NO   |     | NULL    |                |
    | content         | mediumtext           | NO   |     | NULL    |                |
    | thumbnail		  | varchar(255)         | NO   |     | NULL    |                |
    | createdon       | datetime             | NO   |     | NULL    |                |
    | enabled         | enum(0,1)            | NO   |     | 0       |                |
    +-----------------+----------------------+------+-----+---------+----------------+
    En gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Articles  <- Article_translations -> Languages
    id           id                      id
    date         language_id (fr)        locale
    category     article_id  (fr)   
                 content
    Merci pour votre aide.

    Cordialement
    La vitesse de la lumière étant supérieure à celle du son, beaucoup de gens sont brillants jusqu'à ce qu'ils ouvrent leur bouche.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourrais-tu nous décrire les problèmes que tu rencontres ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Bonjour sabotage,

    J'arrive à afficher la liste des derniers articles, mais pas les liens menant vers leurs versions traduites respectives.

    J’aimerais proposer les versions traduites (si existe) du contenue consulté, ex.

    maison-en-bois.html
    |_ (en) wooden-house.html
    |_ (es) casa-de-madera.html


    J’aimerais faire cela via 1 requête si possible.
    La vitesse de la lumière étant supérieure à celle du son, beaucoup de gens sont brillants jusqu'à ce qu'ils ouvrent leur bouche.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    quel est ton problème ? La requête ne remonte pas toutes les informations que tu souhaite ? Tu n'arrive pas à afficher ces informations comme tu le souhaite ?

    Pour moi ta requête est bonne il te suffit de traiter chaque ligne remonter par ton SGBD et utiliser la colonne permalink de ta table translation pour afficher le lien.
    une réponse vous a permis d'avancer ?

  5. #5
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Bonjour Exia93,

    Merci pour ton aide.

    Voici quelques données pour mieux comprendre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    INSERT INTO `articles` (`id`, `date`) VALUES
    (1, '2012-11-21'),
    (2, '2012-11-23');
     
    INSERT INTO `translations` (`id`, `art_id`, `lang`, `permalink`, `title`, `summary`, `content`, `enabled`) VALUES
    (1, 1, 'fr', 'Bienvenue-chez-moi', 'Bienvenue chez moi', '...', '...', '0'),
    (2, 1, 'en', 'welcome-home', 'Welcome home', '...', '...', '1'),
    (3, 1, 'es', 'bienvenida-a-casa', 'Bienvenida a casa', '...', '...', '1'),
    (4, 1, 'de', 'willkommen-zu-Hause', 'Willkommen zu Hause', '...', '...', '0'),
     
    (5, 2, 'fr', 'bonjour-de-paris', 'Bonjour de paris', '...', '...', '0'),
    (6, 2, 'en', 'hello-from-paris', 'Hello from paris', '...', '...', '1'),
    (7, 2, 'es', 'hola-de-paris', 'Hola de paris', '...', '...', '1'),
    (8, 2, 'de', 'Hallo-aus-paris', 'Hallo aus paris', '...', '...', '0');
    Je souhaite afficher la liste des derniers articles en Français et pour chaque article, afficher les liens des traductions correspondantes s’il y'en a.

    Le tout en une requête.

    Edit: j'ai essayer avec des sous-requêtes, unions, jointures mais je sèche...
    La vitesse de la lumière étant supérieure à celle du son, beaucoup de gens sont brillants jusqu'à ce qu'ils ouvrent leur bouche.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Une dernière petite question, comment veut tu afficher le résultat ? Chaque article dans une Div puis une sous-div pour chaque translation ? Ou un lien qui renverra vers la page qui contient la translation ?

    EDIT : Et quand tu dit des derniers article cela veut dire le dernier ou les 2 derniers ou les 10 derniers ?

    EDIT 2 : La dernière question du "chieur" :p
    Peut tu avoir un artcle qui ne soit pas en Français ?
    une réponse vous a permis d'avancer ?

  7. #7
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Ou un lien qui renverra vers la page qui contient la translation ?
    j'aurais du commencer par là, désolé pour mes explications foireuses !

    Je souhaiterais formater la liste dans un tableau, ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +-----------------+-----+-----+-----+-----+
    | Art title       | FR  | EN  | DE  | ES  | <- liens permettant de changer la vue "art title", par defaut liste les derniers article en français
    +-----------------+-----+-----+-----+-----+
    | bonjour-paris   | URL | URL | URL | URL | <- liens permettant d'accéder à l'article traduit
    | bonne-nuit      | URL | URL | URL | URL |
    +-----------------+-----+-----+-----+-----+
    edit: les 10 derniers articles trier par date (desc date).

    Le but est d'avoir un aperçu rapide des articles et de pouvoir jongler entre les différentes traductions pour les (editer/modifier/etc)
    La vitesse de la lumière étant supérieure à celle du son, beaucoup de gens sont brillants jusqu'à ce qu'ils ouvrent leur bouche.

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    De mon coté je prends texto ce que tu dis, comme ceci :
    afficher les liens des traductions correspondantes s’il y'en a.
    Puis dans la requête du 1er post : GROUP BY translations.art_id

    Pour ma part le "s'il y en a" et le GROUP BY translations.art_id seraient contradictoire.
    Je m'explique.
    "S'il y en a" veut dire qu'on souhaite récupérer tous les articles sans exception, donc quelque soit la langue.
    Du coup, en faisant ce GROUP BY (un groupement) sur le champ art.id ça va récupérer qu'un seul article (le 1er) et éliminer tous les autres articles du même ID, donc au final on obtiendra pour chaque article 1 seul article (1 langue).

    Faudrait alors supprimer le GROUP BY translations.art_id.
    Fait un essai pour voir.

    Ensuite il faudrait faire une jointure externe, c'est à dire un LEFT JOIN au lieu de JOIN.
    Car un JOIN (tout court) fera que MySQL va analyser si pour un article.id il existe dans la table "translation".
    - S'il existe ça va le récupérer
    - S'il n'existe pas ça va l'ignorer

    Un LEFT JOIN va récupérer tous les articles (les IDs) même s'il n'existe pas dans la table translation.
    Du coup, admettons que pour un article.id, genre 10, le FR existe, on va avoir une valeur pour le champ title (par exemple), donc son titre en Français.
    Mais admettons qu'il y a rien pour le EN, toujours pour le ID 10, et bien ça va quand même le récupérer mais avec une valeur NULL, donc NULL comme title et tous les champs de la table "translations".

    Fais des essais, en rajoutant dans la requête des champs de la table translation.
    Tout cela sauf erreur.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Pour la requête avec le petit jeu de test que tu a donné elle fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a.idArticle,  l.lang, t.idTranslation, t.permalink, t.title, t.caption, t.content, t.thumbnail, t.createdon, t.enabled
    FROM ( SELECT art_id FROM translations WHERE lang_id = ( SELECT idLang FROM languages WHERE lang = 'fr' ) LIMIT 10 ) fr
    INNER JOIN translations t ON fr.art_id = t.art_id
    INNER JOIN articles a ON t.art_id = a.idArticle
    INNER JOIN languages l ON t.lang_id = l.idLang
    ORDER BY a.date DESC;
    on remonte tous les articles ayant une version FR avec la sous-requête,

    ensuite la jointure sur la table translations va remonter toutes les traductions disponibles pour les articles ayant une version FR,

    puis on joint les tables articles et languages pour pouvoir afficher les info de ces deux tables ( au lieux d'avoir les art_id et lang_id de la tables translations on remonte les valeur dans les tables articles et permet l'order by sur la date)

    si la requête fonctionne aussi chez toi il te suffira de la traiter un php,

    utilise les tableaux a plusieurs dimension avec par exemple comme premier index l'idArticle et comme second index la langue de traduction de l'article.
    une réponse vous a permis d'avancer ?

  10. #10
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Merci pour ton aide Exia93

    Ton modèle SQL retourne bien le résultat souhaitait (), mais sur plusieurs lignes qu'il faut ensuite parcourir une à une...

    Ce que j'ai besoin:

    Chaque ligne de résultat parcouru doit contenir l'article dans la langue par défaut et/ou demander ainsi que ses traductions.
    Sur le chat @GoTrUnKo ma proposer ce modèle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t.id, t.title, 
    	GROUP_CONCAT(DISTINCT t.lang_id SEPARATOR "|") AS lang, 
    	GROUP_CONCAT(DISTINCT permalink SEPARATOR "|") AS urls 
    FROM articles AS a
    	INNER JOIN translations AS t ON a.id = t.art_id
    	INNER JOIN languages AS l ON l.id = t.lang_id
    GROUP BY a.id
    ORDER BY a.date DESC
    LIMIT 10
    Sa théorie serait de faire une requête qui retourne tout, puis de GROUP_CONCAT les url, language, etc et ensuite de splitter dessus pour l’exploiter...

    Avec ce modèle SQL j'obtiens exactement ce que je souhaite mais je n'arrive pas à gérer la langue par défaut et/ou demander des colonnes (t.id, t.title) qui correspondent au changement de vue que j'ai expliquer plus haut.
    La vitesse de la lumière étant supérieure à celle du son, beaucoup de gens sont brillants jusqu'à ce qu'ils ouvrent leur bouche.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Citation Envoyé par la_chouette Voir le message
    Je souhaite afficher la liste des derniers articles en Français et pour chaque article, afficher les liens des traductions correspondantes s’il y'en a.
    Ce besoin est-il toujours d'actualité ? Car en regardant la requête de @GoTrUnKo ne gère pas si tu à des actualités qui n'ont pas de version Française, ma requête par contre ne gère que celle qui ont une version Française donc si tu veut afficher des articles qui ne sont disponible qu'en anglais ou autre sans proposer de version FR elle ne seront pas remonté.

    Ensuite avec ma requête je t'ais aiguillé sur comment géré se résultat sur plusieurs ligne mais avec un colonne redondante pour les translations appartenant à un même article,

    il te suffit quand tu parcourra chaque ligne de ta BDD de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while( $resultat = $requete->fetch() ){
        $tableau[$resultat['idArticle']] = array('lang'=>$resultat['lang']
                                                              ...);
    }
    et ensuite de parcourir ton tableau avec une bouclie foreach() pour le premier niveau (qui représente les idArticle), et une autre pour chaque translation disponible.

    Après c'est selon tes besoin.

    EDIT : Après quelques test sa requête ne renvoi pas tous le temps dans le champ title la version FR du titre et l'ordre des langues est aussi aléatoire même si la colonne lang et permalink son lié :
    si dans la colonne lang tu a :

    fr|es|en

    tu aura dans la colonne url:

    urlFR|urlEs|urlEn

    mais pas forcement dans cette ordre suivant les modifications que tu fait sur ta table ( insert, delete , ... ) ,

    après comme dit plus haut c'est selon ton besoin.
    une réponse vous a permis d'avancer ?

  12. #12
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Car en regardant la requête de @GoTrUnKo ne gère pas si tu à des actualités qui n'ont pas de version Française, ma requête par contre ne gère que celle qui ont une version Française donc si tu veut afficher des articles qui ne sont disponible qu'en anglais ou autre sans proposer de version FR elle ne seront pas remonté.
    Effectivement, tu as raison... le résultat est parfois aléatoire...

    Je vais donc adapter ton modèle SQL et je te fait un retour aussitôt...
    La vitesse de la lumière étant supérieure à celle du son, beaucoup de gens sont brillants jusqu'à ce qu'ils ouvrent leur bouche.

  13. #13
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Fait bien attention comme je te l'ais dis plus haut ma requête ne retourne que les article ayant au moins une version FR il faudra adapter la requête si tu a des artcle exclusivement en anglais ou tous autre langue.
    une réponse vous a permis d'avancer ?

  14. #14
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par la_chouette
    Je souhaite afficher la liste des derniers articles en Français et pour chaque article, afficher les liens des traductions correspondantes s’il y'en a.
    Citation Envoyé par la_chouette
    Effectivement, tu as raison... le résultat est parfois aléatoire...
    Sauf erreur, toujours, cela est lié au GROUP BY que tu conserve sans cesse dans la requête.
    Le coté "aléatoire" en fait parti.


    Il faut en 1er comprendre ce que c'est un GROUP BY, sinon tu risque de ne pas t'en sortir.

    Puis comme je l'avais dit : lorsqu'on souhaite "que les FR" mais aussi "tous les liens des autres langues s'il y en a", c'est contradictoire.
    -> Soit on veut QUE les articles en FR
    -> Soit on veut toutes les langues.
    Que ce soit juste les liens ne changera rien, car la valeur d'un champ "lien" est avant tout liés à un article.

    Lorsqu'on déclare un GROUP BY a.id cela veut dire (en SQL) qu'on ne souhaite qu'un seul et unique article (un seul ID).
    On les regroupe en 1 seul.
    Par conséquent il sera impossible d'obtenir tous les liens de toutes les langues pour un article donné.

    Le coté "aléatoire" (lié là encore au GROUP BY) s'explique du fait que MySQL va récupérer 1 seul et unique article de la table "translation", et ce 1er article sera le 1er enregistré.
    MySQL ne le fait pas vraiment de manière aléatoire.
    Je m'explique.
    Admettons qu'on crée un article, puis qu'on enregistre en 1er que la version FR.
    Ensuite (donc après) on enregistre la version EN.
    Lorsqu'on lancera cette requête avec le GROUP BY a.id, MySQL va appliquer le regroupement, donc retenir qu'1 seul article.
    Et bien comme le FR a été enregistré en 1er c'est celui-ci qui sera récupéré.

    Si cette fois pour un autre article c'est le EN qu'on enregistre en 1er, alors pour la même requête SQL cette fois c'est le EN coté traduction qui sera récupéré pour cet article là.

    D'où le coté "aléatoire" qu'on remarque.


    Ceci dit, un GROUP BY accepte qu'on lui donne une indication dans ce genre de cas, c'est selon l'ordre de récupération : ASC ou DESC.
    Exemple basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT truc
    FROM t1 LEFT JOIN t2 ON t1.id = t2.id
    GROUP BY t2.id DESC

    Pour conclure.
    Si on veut récupérer tous les articles de toutes les langues pour savoir s'il y a un lien ou pas, il ne faut pas faire de GROUP BY (ou regroupement).
    En tout cas, pas sur l'ID de l'article.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  15. #15
    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
    Liste des 10 derniers articles :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id, `date` AS date_article
    FROM articles
    ORDER BY `date` DESC
    LIMIT 10
    Remarques :
    - 'date' est un mauvais nom de colonne car c'est un mot réservé du langage SQL.
    - il est préférable de nommer les tables au singulier.

    Ces articles avec leurs traductions, si elles existent :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT a.id AS id_artricle,
    	l.lang, t.permalink
    FROM 
    (
    	SELECT id, `date` AS date_article
    	FROM articles
    	ORDER BY `date` DESC
    	LIMIT 10
    ) a 
    LEFT OUTER JOIN translations t ON a.id = t.art_id
    	LEFT OUTER JOIN languages l ON l.id = t.lang_id
    ORDER BY a.id, l.lang
    La requête va retourner autant de lignes par article qu'il y aura de traductions.

    Au programme PHP ensuite de parcourir le résultat de la requête pour le mettre en forme et afficher les liens vers les traductions dans les bonnes cases du tableau.

    Chercher à faire ça en SQL, c'est de la cosmétique !
    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 !

  16. #16
    Membre régulier Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    Remarques :
    - 'date' est un mauvais nom de colonne car c'est un mot réservé du langage SQL.
    - il est préférable de nommer les tables au singulier.
    Tu as 100% raison c'est pour cela que j'ai renommer les tables


    Chercher à faire ça en SQL, c'est de la cosmétique !
    Je sais bien mais cela permet d’écrire moins de code pour mettre en forme (avis perso)

    Merci pour ton modèle SQL, je regarde ça de pres.


    Hier @GoTrUnKo m'a soumis un autre modele SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT b.id, b.title,  
    	GROUP_CONCAT(DISTINCT e.lang SEPARATOR "|") AS lang,  
    	GROUP_CONCAT(DISTINCT d.permalink SEPARATOR "|") AS urls
    FROM articles AS a 
    	INNER JOIN translations AS b ON a.id = b.art_id 
    	INNER JOIN languages AS c ON c.id = b.language_id 
    INNER JOIN articles AS d ON d.id = a.id
    	INNER JOIN translations AS e ON d.id = e.art_id 
    	INNER JOIN languages AS f ON f.id = e.language_id 
    WHERE c.locale = 'fr_FR'
    GROUP BY a.id 
    ORDER BY a.date DESC
    Edit: je regarde tout les modèles soumis et vous fait un retour rapidement

    Edit 2: j'ai oublier le principal, MERCI.
    La vitesse de la lumière étant supérieure à celle du son, beaucoup de gens sont brillants jusqu'à ce qu'ils ouvrent leur bouche.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/01/2015, 16h10
  2. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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