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

MySQL Discussion :

Choix d'une traduction si possible dans une table


Sujet :

MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut Choix d'une traduction si possible dans une table
    Bonjour,

    J'avais par le passé réglé ce problème avec un bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    mais bon c'est pas super.

    Aujourd'hui j'aimerais trouver une solution propre à mon problème, mais rien à faire.

    J'ai une table place avec un id et des données quelconques.

    Une table tag :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    +----+--------+
    | id | code   |
    +----+--------+
    |  1 | actor  |
    |  2 | cinema |
    |  3 | music  |
    |  4 | death  |
    +----+--------+
    Une table places_tags qui fait un many to many entre les 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    +----------+--------+
    | place_id | tag_id |
    +----------+--------+
    |        1 |      1 |
    |        1 |      2 |
    |        2 |      3 |
    |        2 |      4 |
    |        3 |      1 |
    |        3 |      4 |
    |        4 |      3 |
    +----------+--------+
    Et enfin tag_string qui propose des titres traduits aux tags :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    +----+--------+---------+----------+
    | id | tag_id | title   | language |
    +----+--------+---------+----------+
    |  1 |      1 | Acteur  | fr       |
    |  2 |      1 | Actor   | en       |
    |  3 |      2 | Cinéma  | fr       |
    |  4 |      2 | Cinema  | en       |
    |  5 |      2 | Cine    | es       |
    |  6 |      3 | Musique | fr       |
    |  7 |      3 | Music   | en       |
    |  8 |      4 | Mort    | fr       |
    |  9 |      4 | Death   | en       |
    +----+--------+---------+----------+
    Avant, dans le meilleur des mondes sales, je faisais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT t.id, ts.title AS title, COUNT(pt.tag_id) AS total
    FROM tag AS t
    INNER JOIN places_tags AS pt
    ON pt.tag_id = t.id 
    INNER JOIN (
        SELECT ts2.tag_id, ts2.title AS title
        FROM tag_string AS ts2
        ORDER BY FIELD (ts2.language, 'en', 'fr') DESC
    ) ts
    ON ts.tag_id = t.id 
    GROUP BY t.id
    ORDER BY total DESC
    Ce qui me donnait tous les tags avec de préférence un titre en français, sinon en anglais.

    Mais aujourd'hui, cela ne fonctionne plus (le group by me jette je vois bien pourquoi).
    Cependant, je ne trouve pas de solution.

    Quelqu'un aurait-il une solution pour me sortir de ce pétrin ?

    J'ai mis ce que ça donnait en ligne ici : http://sqlfiddle.com/#!9/0d9c3b/1

    Merci

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 823
    Par défaut
    Salut Glosialabolas.

    Il est inutile de modifier "sql_mode".

    L'erreur que vous rencontrez se porte sur la colonne "title".
    Je vous conseille de lire ceci : https://dev.mysql.com/doc/refman/5.7...-handling.html
    La solution est de passer par la fonction "any_value(`title`)".

    @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Par défaut
    Merci j'ai essayé et ça fonctionne.

    Entre temps, j'avais trouvé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT t.id, 
    COALESCE(
      (SELECT title FROM tag_string WHERE tag_id = t.id AND language = :locale),
      (SELECT title FROM tag_string WHERE tag_id = t.id AND language = 'en')
    ) AS title,
    COUNT(pt.tag_id) AS total
    FROM tag AS t
    INNER JOIN places_tags AS pt
    ON pt.tag_id = t.id 
    GROUP BY t.id
    ORDER BY total DESC, title ASC

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

Discussions similaires

  1. [AC-2013] Choix d'une table via un formulaire pour une requête SQL
    Par yclaf dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 27/11/2015, 13h35
  2. Réponses: 5
    Dernier message: 03/06/2009, 14h55
  3. [MySQL] choix d'une table sql par une liste déroulante
    Par Tiny Buster dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/07/2008, 22h26
  4. Choix entre une table temporaire et une table #Temp
    Par cfeltz dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/05/2007, 14h59
  5. Réponses: 10
    Dernier message: 16/09/2006, 11h41

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