Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    PHP/MySQL: Esperti -> Compatibilità di subquery MySQL 5 con JOIN MySQL 4

    Dopo avere programmato una applicazione php/mysql in locale, una parte della quale usa una interrogazione tra due tabelle, utilizzando 3 subquery, mi sono accorto che nel server remoto questa non funziona per via della versione 4 installata sul server al quale non posso accedere per installare una versione del DB più recente.

    Passo a spiegare quello che l'applicazione deve fare, quindi indicherò il codice.

    Ho una tabella di anagrafica di etichette discografiche, distribuzioni, locali, agenzie di promozione.
    Ho un'altra tabella all'interno della quale vado a salvare i dati dei lavori discografici che queste entità inviano ad una redazione, al fine di riceverne una recensione.
    Una parte del software sarà incentrata sull'inserimento dei nuovi lavori discografici da esaminare.
    L'intenzione è quella di avere una form che mostra la lista di possibili etichette, distribuzioni, agenzie eccetera, al fine di velocizzare il processo di inserimento di una recensione da parte dei redattori.
    Fin qui tutto bene, e l'inserimento funziona perfettamente.
    Alcuni lavori discografici possono però avere più di una etichetta.
    Nel salvare i dati nella tabella delle recensioni non ho problemi in quanto per ogni etichetta c'è una colonna che contiene un riferimento numerico (all'ID pescato dall'anagrafica).
    Nella query che io avevo scritto si trovavano 3 subquery per andare a leggere il nome dell'etichetta (nell'anagrafica) in base al riferimento numerico della tabella recensione.

    Nel compilare la query in maniera retro-compatibile, però, non riesco a capire come impostare più di una JOIN.
    È per questo che chiedo il vostro aiuto.

    Di seguito la struttura delle tabelle (semplificata per l'occasione):

    codice:
     #### TABELLA ANAGRAFICA ####
    +-------------------+---------------------+
    | Field             | Type                |
    +-------------------+---------------------+
    | id                | int(6) unsigned     |
    | data_inserimento  | timestamp           |
    | tipo              | tinyint(3) unsigned |
    | nome              | varchar(200)        |
    +-------------------+---------------------+
    
    
    #### TABELLA RECENSIONI ####
    +--------------------+---------------------+
    | Field              | Type                |
    +--------------------+---------------------+
    | id                 | int(6) unsigned     |
    | band               | varchar(100)        |
    | titolo             | text                |
    | label1             | tinyint(3) unsigned |
    | label2             | tinyint(3) unsigned |
    | distribuzione      | tinyint(3) unsigned |
    | promo_agency1      | tinyint(3) unsigned |
    | promo_agency2      | tinyint(3) unsigned |
    +--------------------+---------------------+
    La seguente era la query compatibile con MySQL 5:
    Codice PHP:
        SELECT DISTINCT
            sr
    .id AS id
            
    sr.band AS band
            
    sr.titolo AS titolo
            (
    SELECT ap.nome FROM anagrafica_partner ap WHERE ap.id sr.label1) AS label1
            (
    SELECT ap.nome FROM anagrafica_partner ap WHERE ap.id sr.label2) AS label2
            (
    SELECT ap.nome FROM anagrafica_partner ap WHERE ap.id sr.promo_agency1) AS promo_agency 
        FROM 
            status_recensioni sr
    anagrafica_partner ap
        ORDER BY 
             sr
    .data_arrivo ASC
             
    sr.band ASC,
             
    sr.status ASC 
    La seguente è la query di JOIN che sostituisce una sola subquery (funzionante):
    Codice PHP:
        SELECT 
            sr
    .id AS id
            
    sr.band AS band
            
    sr.titolo AS titolo
            
    ap.nome AS label1
        FROM 
            status_recensioni sr
        JOIN    
            anagrafica_partner ap 
        ON    
            ap
    .id sr.label1 
        ORDER BY 
             sr
    .data_arrivo ASC
             
    sr.band ASC,
             
    sr.status ASC 
    Non riesco ad aggiungere le altre due JOIN.
    Chi riesce a darmi una mano?

    Grazie
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  2. #2
    UP
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  3. #3
    Non avendo MySQL 4 non riesco a fare delle prove, ma che errore ti restituisce esattamente? Sei sicuro che il problema siano le join?
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  4. #4
    Originariamente inviato da alcio74
    UP
    devi usare tanti alias diversi per la tabella anagrafica_partner oppure eseguire tante volte la query con UNION cambiando ovviamente il riferimento del campo

    Tanto per es.:

    codice:
        FROM status_recensioni sr
        left JOIN  anagrafica_partner ap1 ON ap1.id = sr.label1 
        left JOIN  anagrafica_partner ap2 ON ap2.id = sr.label2
        left JOIN  anagrafica_partner ap3 ON ap3.id = sr.label3 
    .........
    where ap.id = sr.promo_agency1
    uso left join perche' potresti non avere qualche label... aggiustala tu.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Allora... innanzi tutto grazie per le risposte.

    @ satifal
    Se provo la query originale su MySQL 4 ottengo errore di sintassi, perché semplicemente in quella versione non esiste la possibilità di fare subquery.

    @ piero.mac
    Avevo subodorato fosse un problema di alias ed avevo pure provato a buttare giù del codice, ma forse sbagliavo qualcosa nella sintassi.
    Faccio delle prove e poi vi faccio sapere.
    Non avevo neanche lontanamente pensato al LEFT JOIN, ed in effetti sì: potrei avere delle celle vuote nel DB.

    Ripeto: per ora grazie!
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  6. #6
    Piero, devo ammettere che sei sempre un grande!
    La query è perfettamente funzionante sia nella versione 4 sia nella 5 di MySQL!!!!!

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  7. #7
    Prosit!

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.