Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [MySQL] query "doppia" da id relazione 2 tabelle

    Salve. Ho un campo select su una pagina dove l'utente seleziona il nome di un'attività (che corrisponde al nome di un campo) per vedere se esiste nella tabella "settori" una cooperativa che svolge quell'attività (i valori del campo sono 1-0 che corrispondono ovviamente a si o no):
    Codice PHP:
    mysql_select_db($database_ConnCoop$ConnCoop); $query_Rs_ricerca "SELECT ".$campo_nella_query.", IDcoop FROM settori WHERE ".$campo_nella_query." = '1'"
    così ottengo un elenco di IDcoop che corripondono ad ogni cooperativa che lavora in quel settore.
    Il problema è il seguente: dagli IDcoop estratti dalla tabella "settori" devo recuperare i dati dei campi della tabella "cooperative" che ha IDcoop in comune.
    Ho provato con INNER JOIN
    Codice PHP:
    mysql_select_db($database_ConnCoop$ConnCoop); $query_Rs_ricerca "SELECT settori.".$campo_nella_query.", settori.IDcoop FROM settori INNER JOIN coop ON settori.IDcoop = coop.IDcoop WHERE settori.".$campo_nella_query." = '1'" 
    ma non basta. A dire il vero non ho gran conoscenza di SQL e fino ad ora me la sono cavata grazie a Dreamweaver.
    Si tratta prima di tutto di trovare l'approccio giusto. Cioè cosa devo usare?
    INNER JOIN, UNION, una sottoquery?
    Prima si deve eseguire la query sulla tabella "settori" e poi dagli IDcoop ricavati interrrogare la tabella "cooperative" e non si può fare tutto in colpo solo, con una sola query?
    Come potete capire c'è molta confusione. Ringrazio per ogni possibile spunto. Saluti

  2. #2
    non si capisce bene. Cosa contiene il $campo_nella_query ?

    Quella e' una costante (il nome del campo) e non una attivita' che sara' invece un'attributo del campo. Hai per caso un campo per ogni attivita'? Non e' chiara la domanda.

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

  3. #3
    Esatto. Ho un campo per ogni attività e c'è un menù a tendina, nella pagina di ricerca, con l'elenco di tutte le attività. Il dato selezionato (cioè il campo su cui cercare) viene passato alla query tramite la variabile php "$campo_nella_query". Tutti i valori positivi (sono campi 1-0) trovati nella tabella "settori" mostrano un IDcoop per ogni record, corrispondente alle cooperative che svolgono quell'attività.
    Il problema è che da questa tabella, che contiene solo gli IDcoop e le attività, io devo prendere i dati (Ragione sociale, indirizzo, eccetera) che sono nell'altra tabella "cooperative" che ha il campo IDcoop in relazione con quello della tabella "settori".
    Che approccio addottare?
    Un saluto e un grazie per qualsiasi indicazione di chiarimento

  4. #4
    Originariamente inviato da zanzu
    Esatto. Ho un campo per ogni attività e c'è un menù a tendina, nella pagina di ricerca, con l'elenco di tutte le attività. Il dato della selezione (cioè il campo su cui cercare) viene passato alla query tramite la variabile php "$campo_nella_query". Tutti i valori positivi (campo 1-0) trovati nella tabella "settori" corrispondono ad un IDcoop per ogni record, cioè alle cooperative che svolgono quell'attività.
    Il problema è che da questa tabella, che contiene solo gli IDcoop e le attività, io devo prendere i dati (Ragione sociale, indirizzo, eccetera) che sono nell'altra tabella "cooperative" che ha il campo IDcoop in relazione con quello dell'altra tabella.
    Che approccio addottare?
    Un saluto e un grazie per qualsiasi indicazione di chiarimento
    Continuo ad avere un dubbio. Dovresti avere un CAMPO chiamiamolo "attivita" (senza accento) che ha dei record in cui sono elencate le attivita'. Per capirci:
    codice:
    id  -  campo_attivita
    
    1   -  cucito
    2   -  cucina
    3   -  fantasia
    4   -  ceccobeppe
    5   -  ciccio
    LA cosa dovrebbe essere come questa descritta.

    La query sara' con una inner join

    codice:
    select *
    from coop
    inner join settori on coop.id = settori.id
    where coop.tuo_campo = 1
    and attivita = 'fantasia'
    Quindi il campo "attivita" e' uno solo con tanti record.

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

  5. #5
    Non posso cambiare struttura. Proprio per questo la faccenda è particolarmente complessa. Non ho un solo IDcoop, ne ho tanti.
    Ci sarà pure un modo di estrarre il resto dei dati dalla tabella con l'anagrafica se conosco gli ID. Magari in due passaggi. Tipo: la prima query estrae l'elenco degli ID delle cooperative dalla tabella "settori" tramite un file php e subito dopo fa un redirect a un'altra pagina php che prende gli ID ed estraee i dati dall'altra tabella.
    Dovrebbe funzionare. Quello che non so è come fare la seconda query, cioè come inviare questa serie di ID a MySql e dirgli di estrarmi il resto dei dati di tutti gli altri campi della tabella "cooperative".

  6. #6
    Originariamente inviato da zanzu
    Non posso cambiare struttura. Proprio per questo la faccenda è particolarmente complessa. Non ho un solo IDcoop, ne ho tanti.
    Ci sarà pure un modo di estrarre il resto dei dati dalla tabella con l'anagrafica se conosco gli ID. Magari in due passaggi. Tipo: la prima query estrae l'elenco degli ID delle cooperative dalla tabella "settori" tramite un file php e subito dopo fa un redirect a un'altra pagina php che prende gli ID ed estraee i dati dall'altra tabella.
    Dovrebbe funzionare. Quello che non so è come fare la seconda query, cioè come inviare questa serie di ID a MySql e dirgli di estrarmi il resto dei dati di tutti gli altri campi della tabella "cooperative".
    Sinceramente non riesco a capira la struttura del tuo database.

    Certo che hai tanti IDcoop, almeno uno per ogni coop... poi dovresti avere tanti id_attivita' uno per ogni attivita'. Quindi ad ogni coop andra' associato un id_attivita', se una coop ha piu' attivita' allora ci vorra' una terza tabella che associ IDcoop -> a tutti gli id_attivita' che gli competono.

    Queste sono regole imprescindibili per un database relazionale.

    Per quanto riguarda quello che vuoi fare non serve fare alcun redirect. Prendi la lista degli ID la metti in una variabile e poi la utilizzi nel where della seconda query. Mi pare anche di capire che non hai nessuna relazione tra le due tabelle.

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

  7. #7
    Cerco di spiegare bene la struttura del database.
    La tabella "cooperative" contiene i campi: IDcoop, Ragione, IVA, indirizzo, telefono, eccetera...
    La tabella "settori" contiene i campi: IDsettore, Idcoop, agricoltura, industria, carpenteria, servizi, eccetera per qualche decina di campi. La compilazione del dato sulle attività avviene tramite lo spunta di un checkbox che da il valore 1; cioè nella pagina di inserimento dei dati della cooperativa c'è un campo chekbox per ogni attività.
    Lo scopo della ricerca è sapere quali cooperative svolgono una determinata attività. Se voglio sapere chi fa "segreteria", seleziono questa attività dal menù a tendina e mi vengono fuori gli IDcoop di chi fa quel lavoro. Chiaramente poi devo mostrare anche il resto dei dati che sono nell'altra tabella.
    Non ho ancora creato la relazione tra i due IDcoop ma posso farlo ora.
    Grazie

  8. #8
    Originariamente inviato da zanzu
    Cerco di spiegare bene la struttura del database.
    La tabella "cooperative" contiene i campi: IDcoop, Ragione, IVA, indirizzo, telefono, eccetera...
    La tabella "settori" contiene i campi: IDsettore, Idcoop, agricoltura, industria, carpenteria, servizi, eccetera per qualche decina di campi. La compilazione del dato sulle attività avviene tramite lo spunta di un checkbox che da il valore 1; cioè nella pagina di inserimento dei dati della cooperativa c'è un campo chekbox per ogni attività.
    Lo scopo della ricerca è sapere quali cooperative svolgono una determinata attività. Se voglio sapere chi fa "segreteria", seleziono questa attività dal menù a tendina e mi vengono fuori gli IDcoop di chi fa quel lavoro. Chiaramente poi devo mostrare anche il resto dei dati che sono nell'altra tabella.
    Non ho ancora creato la relazione tra i due IDcoop ma posso farlo ora.
    Grazie
    decisamente la struttura dovrebbe essere migliorata:

    tab_cooperative
    IDcoop, IDsettore, Ragione, IVA, indirizzo, telefono, eccetera

    tab_settori
    IDsettore, tipo_settore, altri
    dove tipo_settore = agricoltura, industria, carpenteria, servizi, eccetera

    La tabella cooperative "deve" avere un settore altrimenti non e' significativa
    La tabella settori non ha bisogno della tabella cooperative
    La relazione tra cooperative e settori deve avvenire con IDsettore.

    Se una cooperativa puo' avere piu' settori allora serve una terza tabella per impedire una relazione diretta molti a molti (molti settori a molte cooperative)

    tab_unione
    id_unione, IDcoop, IDsettore

    Questa deve essere la struttura del database. Dovresti fare questo aggiornamento al tuo db. Try your best ... La tabella settori confonde i campi con i record,

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

  9. #9
    Quello che tu mi dici è certamente l'approccio procedurale più corretto per i database relazionali e ho pensato seriamente a come cambiare impostazione secondo il tuo suggerimento. Nello specifico di questo lavoro però temo che siano più le cose che mi andrei a complicare che quelle che risolvo.
    Attualmente nella tabella dei settori di lavoro ho un record per ogni cooperativa che mi basta associare tramite l'IDcoop. L'inserimento e l'aggiornamento da pagine php è molto pratico.
    D'altro canto questa impostazione, anche se non è secondo i canoni non dovrebbe comportarmi conseguenze sulla funzionalità del tutto. Se vuoi darci un'occhiata: http://lnx.ceisdonmilani.com/select_settori.php
    Quello che mi rimane da fare è rendere funzionale la ricerca ed evitare possibili brutti scherzi come "iniezioni" di codice SQL. Se risolvo le query con qualche variabile credo possa andar bene lo stesso. Ritengo comunque molto importante un tuo parere in quanto c'è ancora il tempo di fare cambiamenti alla struttura se necessario.
    Grazie

  10. #10
    seriamente: cambia la struttura come suggerito. Non puoi fare una colonna per ogni attivita'. Se aggiungi o modifichi una attivita' devi ricorrere all'alter table. Tieni presente che fatta una struttura definita per un progetto questa struttura DEVE essere INAMOVIBILE se non viene sottoposta a revisione di progetto.

    Non e' un grosso problema. In una colonna metti tutte le attivita' che ti pare, la ricerca avverra' mettendo la variabile come dato e non come colonna

    SELECT settori.".$campo_nella_query." ....
    ....
    where settori.".$campo_nella_query." = 1

    diventerebbe

    SELECT settori.tipo_settore ....
    ....
    where settori.tipo_settore = '$campo_della_query'

    dove
    $campo_della_query = 'SEGRETERIA';

    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.