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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif 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
    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

  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
    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 très actif 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
    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.

  4. #4
    Membre Expert
    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
    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.

  5. #5
    Membre très actif 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
    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...

  6. #6
    Membre Expert
    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
    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 ?

  7. #7
    Membre Expert
    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
    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.

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Membre très actif 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
    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.

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