Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331

    [MariaDB] problema su una union

    Ciao a tutti, ho un problema su una query con una union su due select

    La struttura del DB (che non posso modificare) è la seguente:

    TABLE_C
    id
    name

    TABLE_D
    id
    tablec_id (FK)
    label

    TABLE_SD
    id
    tablec_id (FK)
    label

    e una terza tabella TABLE che ha come campi
    id
    tabled_id (FK)
    tablesd_id (FK)

    può succedere che ci in TABLE ci siano dati con solo TABLE_SD non nulla mentre non ci sono campi con TABLE_D non nulli.

    A seconda dei campi di ricerca e order by ce ricevo potrei avere questa query:

    select t.id deviceID
    from TABLE t
    left join TABLE_SD sd on t.tablesd_id =sd.id
    left join TABLE_C c on sd.tablec_id=c.id
    where c.name LIKE ('%ubb%')
    union
    select t.id deviceID
    from TABLE trp
    left join TABLE_D d on t.tabled_id =d.id
    left join TABLE_C c on d.client_id=c.id
    where c.name LIKE ('%ubb%')
    order by d.label asc

    in questo caso la tabella TABLE ha solo elementi collegati a TABLE_SD e non a TABLE_D e io vorrei che mi tornasse tutti gli elementi di TABLE ignorando (di fatto) l'orderby è possibile?
    O si può in qualche modo intercettare il fatto che la seconda query non ha elementi ignorando quindi l'order_by?
    La query mi da come errore Table 'd' from one of the SELECTs cannot be used in ORDER clause

    Invece funziona questa query:

    select t.id deviceID
    from TABLE t
    left join TABLE_D d on t.tabled_id =d.id
    order by d.label asc

    e mi torna tutti i dati di TABLE ignorando, di fatto, l'order by

    Grazie a chi riuscirà a darmi supporto
    Ultima modifica di DarthSandr; 22-12-2021 a 13:59

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    L'ho risolta mettendo

    select t.id deviceID, NULL label
    from TABLE t
    left join TABLE_SD sd on t.tablesd_id =sd.id
    left join TABLE_C c on sd.tablec_id=c.id
    where c.name LIKE ('%ubb%')
    union
    select t.id deviceID, d.label label
    from TABLE trp
    left join TABLE_D d on t.tabled_id =d.id
    left join TABLE_C c on d.client_id=c.id
    where c.name LIKE ('%ubb%')
    order by label asc

    Potete chiudere il thread

  3. #3
    Quote Originariamente inviata da DarthSandr Visualizza il messaggio
    L'ho risolta mettendo

    select t.id deviceID, NULL label
    from TABLE t
    left join TABLE_SD sd on t.tablesd_id =sd.id
    left join TABLE_C c on sd.tablec_id=c.id
    where c.name LIKE ('%ubb%')
    union
    select t.id deviceID, d.label label
    from TABLE trp
    left join TABLE_D d on t.tabled_id =d.id
    left join TABLE_C c on d.client_id=c.id
    where c.name LIKE ('%ubb%')
    order by label asc

    Potete chiudere il thread
    Ottimo che hai trovato la soluzione ma, così a occhio, anzichè una union potresti fare una sola query con delle leftjoin.
    La prima query che fai cerca dalla TABLE qualcosa che soddisfi la ricerca su TABLE_C.
    La seconda query anche ma in join con un'altra tabella...
    Nella prima quindi fai una left join tra TABLE e TABLE_SD e left join tra TABLE_SC e TABLE_C, prendendo ciò che ha qualcosa di corrispondente in TABLE_C.
    Nella seconda invece fai la stessa cosa ma con TABLE_D anzichè TABLE_SC.
    Ora...non ti conviene fare una unica left join tra le tabelle con le giuste condizioni?
    Tipo
    codice:
    select 
        `t`.`ID` AS `deviceID`
    from
        `TABLE` as `t1`
    left join
        `TABLE_SD` as `t2`
      ON
        `t2`.`ID` = `t1`.`tablesd_id`
    left join
        `TABLE_C` as `t3`
      ON
        `t3`.`ID` = `t2`.`tablec_id`
         OR
         `t3`.`ID` = `t4`.`client_id`
    left join
        `TABLE_D` as `t4`
      ON
        `t4`.`ID` = `t1`.`tabled_id`
    where
        `t3`.`name` like ('%ubb%')
    order by
         `label` ASC
    Nella order non ho capito dove risieda "label" ma basta metterci davanti l'alias della tabella.
    A rigor di logica dovrebbe funzionare, così come l'ho messa giù, ma sono relativamente di fretta e non ho ben capito la questione della label che può essere null ecc....
    Prova :-)

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 © 2025 vBulletin Solutions, Inc. All rights reserved.