Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di JoeP
    Registrato dal
    May 2004
    Messaggi
    558

    [MySQL] Query con "degradazione"

    Ciao a tutti. Ho bisogno di realizzare un query un pochino complicata. Ho una tabella per le traduzioni del sito fatta in questo modo:

    codice:
    | ID | LANG |  CODE  |  DATA  |
    |----|------|--------|--------|
    |  1 |   en |  title |  Title |
    |  2 |   it |  title | Titolo |
    |  3 |   en |   text |  Lorem |
    |  4 |   en | thanks | Thanks |
    |  5 |   it | thanks | Grazie |
    |  6 |   fr | thanks |  Merci |
    Dove ID è PRIMARY KEY e (LANG, CODE) è UNIQUE.

    Il testo in inglese è sempre presente per ogni CODE, ma le altre lingue possono essere incomplete. Ora, supponiamo che la lingua corrente sia l'italiano (it). Voglio leggere il campo DATA in italiano per ogni codice, e se ci sono codici senza la relativa traduzione italiana, voglio leggere il campo DATA inglese. Quindi, vorrei questo risultato:

    codice:
    |  CODE  |  DATA  |
    |--------|--------|
    |  title | Titolo |
    |   text |  Lorem |
    | thanks | Grazie |
    Dove text -> Lorem è caricato dalla riga inglese en perché non esiste il corrispondente italiano it.

    Subquery e altre diavolerie sono ben accette. E' possibile?

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Prova così

    codice:
    select * from tabella where lang = 'it'
    union
    select t1.* from tabella as t1
    left join 
    (select * from tabella where lang = 'it') as t2
    on t1.code = t2.code
    where t2.id is null

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Me n'ero dimenticato un pezzo.
    Adesso mi sembra corretta.

    codice:
    select * from tabella where lang = 'it'
    union
    select t1.* from tabella as t1
    left join 
    (select * from tabella where lang = 'it') as t2
    on t1.code = t2.code
    where t2.id is null and lang = 'en'

  4. #4
    Utente di HTML.it L'avatar di JoeP
    Registrato dal
    May 2004
    Messaggi
    558
    Me la sono cavata senza UNION:
    codice:
    SELECT (CASE WHEN it.`data` IS NULL THEN en.`data` ELSE it.`data` END) AS data
    FROM tabella AS en
    LEFT JOIN tabella AS it ON it.code=en.code AND it.lang='it'
    WHERE en.lang='en'
    O ancora meglio, sostituire il CASE ... ELSE con COALESCE()

    Grazie lo stesso

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.