Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Horez
    Registrato dal
    Oct 2007
    Messaggi
    25

    [MySQL] Query Articolata

    Buonasera,
    vorrei chiedervi un aiuto nel costruire una query per un progetto che sto sviluppando.
    In pratica ho una Tabella A e una Tabella B, collegate tra loro per un ID.

    La Tabella A è composta dai campi
    ID | Nome | Paese | Tipologia

    La Tabella B è composta dai campi
    ID | ID_associato | Nome

    La relazione tra le due tabelle è ad ogni valore di riga della Tabella A potranno essere associati più valori della Tabella B che presenteranno nel campo ID_associato l'id del proprietario.

    Quello che vorrei fare io (lo scrivo in pseudo MySQL) è:

    Selezionare i nomi dalla Tabella A che hanno come paese='xxx' e come tipologia='yyyy' e che abbiano una riga (associata) nella Tabella B di nome='kkk' e un altra di nome='zzz'

    Spero di non aver reso il mio pensiero contorto, ho il cervello fuso e la stanchezza non mi aiuta a trovare la soluzione.

  2. #2
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592
    SELECT * FROM TABELLAA LEFT JOIN TABELLAB ON (TABELLAA.id = TABELLAB.ID_associato) WHERE paese = '$paese' AND tipologia = '$tipologia'

    una roba simile?
    io non uso mai o quasi quando devo fare le join i nomi dei campi uguali in tabelle diverse, ma è solo un modo per me di evitare di fare errori ridicoli.

  3. #3
    Utente di HTML.it L'avatar di Horez
    Registrato dal
    Oct 2007
    Messaggi
    25
    Grazie dell'aiuto,
    ma in realtà non è la soluzione completa poichè rappresenta solo parte la parte più semplice del problema.

    In realtà non sono solo le condizioni luogo e tipologia da tener presenti, ma la parte difficile è tener presente le occorrenze nella tabella B.

    Mi spiego meglio con un esempio:
    Supponiamo che la Tabella A sia la tabella "Genitore" e che la tabella B sia la tabella "Figli"
    io vorrei che una query del tipo

    Seleziono le informazioni di ogni genitore che abiti a "Padova" che sia "Impiegato (tipologia)" e che abbia 2 figli (righe nella seconda tabella) uno di nome "Alberto" e l'altro di nome "Luca"

    Spero di trovare il vostro aiuto perchè io non ne vengo a capo.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    select tabella_a.*,group_concat(tabella_b.nome order by tabella_b.nome) as figli from tabella_a
    inner join tabella_b
    on tabella_a.id = tabella_b.id_associato
    group by tabella_b.id_associato
    having find_in_set('alberto',figli) and find_in_set('luca',figli)
    oppure

    codice:
    select tabella_a.* from tabella_a
    inner join tabella_b as uno on tabella_a.id = uno.id_associato
    inner join tabella_b as due on tabella_a.id = due.id_associato
    where uno.nome = 'alberto' and due.nome = 'luca'
    In pratica fa il paio con quest'altra discussione .

  5. #5
    Utente di HTML.it L'avatar di Horez
    Registrato dal
    Oct 2007
    Messaggi
    25
    Diciamo che il problema si è leggermente evoluto e ancora non ho trovato la soluzione giusta.
    Supponiamo che abbia "solo" la tabella FIGLI e che voglia selezionare i distinti id_padre che hanno come figli x,y...n.

    Esempio:
    Figli
    id | id_padre | nome
    1 2 Alberto
    2 3 Mario
    3 5 Alberto
    4 2 Luca
    5 4 Paolo

    Vorrei una query che ricerchi ad esempio gli id padre che hanno le n occorrenze nella tabella figli.

    La query che ho provato è:
    Codice PHP:
    SELECT uno.id_padre FROM figli AS uno
    INNER JOIN figli 
    AS due ON uno.id_padre due.id_padre
    WHERE uno
    .nome 'aldo' AND due.nome 'giulio' 
    GROUP BY uno.id_padre 
    Sembra funzionare, ma non vi è un modo decisamente più semplice di scriverla in modo da permettermi di editare dinamicamente questa query a secondo di quanti (1..n) parametri selezioniamo?

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Usa la prima soluzione tramite group_concat, adattandola alla tua tabella. Puoi creare dinamicamente la parte relativa a find_in_set concatenando i vari and specificando tutti i parametri che ti servono.

  7. #7
    Utente di HTML.it L'avatar di Horez
    Registrato dal
    Oct 2007
    Messaggi
    25
    Grazie per l'aiuto, posto per i futuri posteri la soluzione al mio problema

    Codice PHP:
    SELECT uno.id_padreGROUP_CONCATdue.nome
    ORDER BY due
    .nome ) AS tutti
    FROM figli 
    AS uno
    INNER JOIN figli 
    AS due ON uno.id_padre due.id_padre
    GROUP BY uno
    .id_padre
    HAVING find_in_set
    'luca'tutti )
    AND 
    find_in_set'alberto'tutti 

    //le condizioni find_in_set possiamo aumentarle o diminuirle per filtrare
    //o meno ulteriormente la ricerca 

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Se usi questa soluzione non ti serve fare il join con la tabella stessa

    codice:
    SELECT id_padre, GROUP_CONCAT(nome ORDER BY nome ) AS tutti
    FROM figli 
    GROUP BY id_padre
    HAVING find_in_set( 'luca', tutti )
    AND find_in_set( 'alberto', tutti )

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.