Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308

    [PHP/MySQL] Utilizzare valore campo come nome tabella per join nella medesima query

    Ciao,
    il mio problema è praticamente spiegato tutto nel titolo, vorrei sapere se è possibile utilizzare un valore contenuto in un campo come tabella utile per effettuare una join, per esempio

    SELECT * FROM tab1 a LEFT JOIN tab2 b ON b.key_id = a.key_id LEFT JOIN b.tabella_join c ON c.b.join_table_key = b.id_record

    Come potete vedere dalla query dovrei utilizzare un valore anche per conoscere il campo con cui effettuare la join.
    Ho fatto diverse ricerche e diverse prove, senza un gran risultato, qualcuno ha qualche consiglio?
    Grazie

  2. #2
    non potrai mai farlo perche' per primo viene risolto il nome della tabella poi l'eventuale where e solo dopo i nomi dei campi utilizzati.

    A parte che mi sfugge la logica che utilizzi, cioe' un nome di tabella inserito come valore in un campo da estrarre per essere utilizzato come nome di tabella da utilizzare in join con la tabella stessa che contiene il campo id_record ... eventualmente fai una ulteriore tabella che contenga la lista delle tabelle.

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

  3. #3
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao,
    ti ringrazio della risposta, immaginavo che non si potesse fare.
    Ti spiego la logica, così eventualmente mi dai un aiuto a fare quello che vorrei fare.

    Ho una tabella 'media', dove sono salvate le immagini, i video ecc ecc.

    tabella media

    id_media | nome | data

    Ogni media può essere relazionato a n record di qualsiasi tabella del database

    id_media | id_record | id_tabella

    Come hai detto tu, ho già la tabella con il listato delle tabelle

    id_tabella | nome_tabella | nome_chiave_primaria


    Il risultato che vorrei ottere è una stringa, ottenuta con GROUP_CONCAT, di tutti i nomi dei record a cui un dato media è stato assegnato.


    Ho un'idea su come ottenere questo risultato, ma l'unico metodo che ho in mente implica l'esecuzione di nuove queries per ogni record estratto.

    Qualche soluzione migliore?
    Grazie

  4. #4
    Non si capisce perche' dovresti avere tante tabelle da relazionare. Sei certo della struttura data al db? Domanda: perche' tante tabelle, a cosa servono?

    la struttura dovrebbe essere:

    media - id_media | nome | data

    tabella (quella che chiami "tabella") con tutti i campi necessari oltre a quelli descritti

    relazione - id_relazione | id_media | id_tabella

    non servono altre tabelle.

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

  5. #5
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Allora, provo a spiegarti il mio ragionamento.

    Nel mio database ho una tabella per le pagine, una per le categorie e diverse altre tabelle per altre cose.

    Per ognuna di queste ho la necessità di poter relazionare dei media, come per esempio le immagini.

    E' per questo che ho pensato alla gestione come descritta sopra, in quanto, con un'unica tabella posso gestirmi i media relazionati con ogni singolo record di ogni tabella.


    Questo sistema l'ho già testato con un cms che ho costruito in passato, ed è molto funzionale. Il mio problema purtroppo è che vorrei far visualizzare i nomi attribuiti ai record delle varie tabelle a cui un certo id media è stato attributo, es.

    Media id 10 -> titolo pagina ( tab pagine ), titolo pagina #18 ( tab pagine ), titolo categoria ( tab categorie )

    Non credi sia funzionale?

    Mi rendo conto però che è impossibile con una sola query..
    Non è comunque la fine del mondo, basta omettere la visualizzazione dei nomi dei record a cui un media è attribuito.

  6. #6
    sinceramente non mi e' chiara la struttura del tuo db.

    fai le tabelle che ti servono e poi unisci tutte le relazioni con una singola tabella di unione.

    Quando farai la ricerca sara' sufficiente cercare nella tabella di unione tutte le corrispondenze di tutte le altre tabelle in left join mettendo poi nel where la condizione base della ricerca. Devi solo relazionare le chiavi primarie e non le stringhe.

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

  7. #7
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Scusa se insisto, ma esattamente cosa non è chiaro?
    Probabilmente non mi sono spiegato in qualche punto, vorrei sapere dove.

    Tu come gestiresti la possibilità di relazionare n allegati per ogni record di ogni tabella usando 1 sola tabella del db?

    PS.
    Dopodichè non ti disturbo più

  8. #8
    Originariamente inviato da Razorblade
    Tu come gestiresti la possibilità di relazionare n allegati per ogni record di ogni tabella usando 1 sola tabella del db?
    non e' chiaro come hai strutturato il database. Potrebbe andare bene come anche no.

    Quello che per te e' ovvio non lo e' per chi non ha idea di cosa, del perche' e come lo gestisci.

    Facciamo un esempio con tre tabelle strutturate come presumo di aver capito:

    media
    id_media | nome | data

    ciccio
    id_ciccio | id_media | nome_ciccio | desc_ciccio | altro_ciccio

    pallo
    id_pallo | id_media | nome_pallo | desc_pallo | altro_pallo

    tu vuoi trovare tutti i nomi di ciccio e pallo raggruppati con group_concat potresti fare:

    codice:
    select media.nome, 
    group_concat(distinct nome_ciccio) as ciccio,
    group_concat(distinct nome_pallo) as pallo
    from media a
    left join ciccio b on a.id_media = b.id_media
    left join pallo c on a.id_media = b.id_media
    ovviamente lo devi fare per tutte le tebelle presenti che utilizzano i record della tabella media.

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

  9. #9
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    No, non ci siamo capiti.
    Ho preparato qui di seguito una immagine raffigurante le principali tabelle in questione:

    abbiamo table_media relazionata 1 a molti con table_media_record, in parole più semplici una immagine, video, pdf che sia può essere allegato a più risorse.


    Queste risorse sono individuabili dall'accoppiata id_record - id_tabella, che hanno la funzione di coordinate. Il nome della tabella a cui il record id_record appartiene lo ricaverei relazionando table_media_record con table_tables. E qui c'è il blocco.

    Le tabelle table_categories e table_pages sono solo un esempio delle tabelle a cui id_record potrebbe appartenere.

    Ponendo che table_categories sia identificato come table_id#1 e table_pages come table_id#2,

    e avendo un media_id#1 ( un'immagine per esempio )

    e volessi allegare questa immagine ai record 18 e 19 di table_pages e al record 20 di table categories, table_media_record avrebbe le seguenti righe

    media_id | table_id | record_id
    1 | 2 | 18
    1 | 2 | 19
    1 | 1 | 20

    è più chiaro adesso?
    Immagini allegate Immagini allegate

  10. #10
    Si capisce meglio adesso.....

    Non puoi estrarre il nome della tabella ed utilizzarlo nella stessa query e questo rende la tabella table_tables inutile al tuo scopo. Dovresti aggiungere un campo media_id alle tabelle categories e pages e poi utilizzarle direttamente con table_media poiche' la relazione sara' sempre 1 a molti. 1 media con molti record categories o pages. La query diventerebbe:

    codice:
    select 
    --- quello che serve
    from media
    left join categories on media.media_id = categories.media.id
    left join pages on media.media_id = pages.media_id
    ..... se serve where
    se invece cuoi sapere da quante tabelle e' utilizzato un certo media basta la classica query:
    codice:
    select distinct tables.table_name
    from table_media_records a
    left join table_media b using(media_id)
    left_join table_tables c using(table_id)
    puoi fare un mixer delle query per estrarre un eventuale nome tabella/record.

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