Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119

    [MySql] Select per database relazionale "molti a molti"

    Ciao a tutti,
    mi sono piantato su un problema che mi sembra banale. Probabilmente è più difficile a dirsi che a farsi, quindi cerco di spiegarlo con un esempio:

    Ho 3 tabelle, una per i prodotti, una per gli ingredienti e la terza per le relazioni...

    Tab1
    ID Prodotto Descrizione
    1 Torta dolce bla bla
    2 Pane bla bla bla
    3 Pizza bla bla bla

    Tab2
    ID ingredienti
    1 Farina
    2 Zucchero
    3 Uova

    Tab3
    prodID ingID
    1 1
    1 2
    1 3
    2 1
    3 1

    Vorrei con una query chiedere che mi vengano restituiti i prodotti che contengono sia farina che zucchero,
    quindi in questo caso "Torta dolce"

    Io finora sono arrivato a questo:
    Codice PHP:
    SELECT ProdottoDescrizione 
    FROM Tab1
    Tab2Tab3
    WHERE 
    (Tab2.ingredienti "Farina" OR Tab2.ingredienti "Uova"
    AND 
    Tab3.prodID Tab2.id AND Tab3.ingIID Tab1.id 
    Group By Tab1
    .Prodotto 
    Ma non va bene perchè ottengo anche i prodotti che contengono solo Farina o solo Uova, e se metto AND al posto di OR non ottengo giustamente risultati.

    Come si fa?

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Prova così

    codice:
    select tab1.prodotto from tab1
    inner join tab3 as due on tab1.id = due.prodid
    inner join tab3 as tre on due.prodid = tre.prodid
    where due.ingid = 1 and tre.ingid = 2

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    Grazie mille, funziona, anche se non capisco bene come.
    Provo a studiarci un pò...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    Non mi sembra che sia possibile generalizzare la soluzione nel caso in cui anzichè 2 ingredienti io ne voglia scegliere "n".

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Devi create tot self join.

    Per esempio per trovare tutti i prodotti che hanno gli ingredienti 1,2 e 3 la query diventerebbe

    codice:
    select tab1.prodotto from tab1
    inner join tab3 as due on tab1.id = due.prodid
    inner join tab3 as tre on due.prodid = tre.prodid
    inner join tab3 as quattro on due.prodid = quattro.prodid
    where due.ingid = 1 and tre.ingid = 2 and quattro.ingid = 3
    oppure ho pensato a un'altra soluzione tramite la concatenazione degli id degli ingredienti e relativa ricerca all'interno di tale stringa

    codice:
    select tab1.prodotto,group_concat(tab3.ingid) as prodotti
    from tab1
    inner join tab3 on tab1.id = tab3.prodid
    group by prodid
    having find_in_set(1,prodotti) and find_in_set(2,prodotti) and find_in_set(3,prodotti)

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    ...sono arrivato a qualcosa di simile anch'io prendendo spunto da questo articolo :

    Codice PHP:
    SELECT tab1.prodottoGROUP_CONCATDISTINCT tab2.ingredienti
    ORDER BY tab2
    .ingredienti ASC
    SEPARATOR 
    ',' ) AS tutti_ingredienti
    FROM tab1
    JOIN tab3 ON 
    tab1.id tab3.prodID )
    JOIN tab2 ON tab2.id tab3.ingID )
    GROUP BY tab1.id
    ORDER BY prodotto ASC 
    raggruppa tutto nel modo corretto ma poi non lo so gestire.

    Onestamente credevo fosse più semplice...
    Ora ci studio e cerco di capire come rendere tutto dinamico (con PHP) come avevo in mente,

    grazie ancora!

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    119
    Grazie a nicola75ss sono giunto a questo, che è quello che mi serviva:

    Codice PHP:
    SELECT tab1.prodottoGROUP_CONCATDISTINCT tab2.ingredienti
    ORDER BY tab2
    .ingredienti ASC
    SEPARATOR 
    ',' ) AS tutti
    FROM tab1
    JOIN tab3 ON 
    tab1.id tab3.prodID )
    JOIN tab2 ON tab2.id tab3.ingID )
    GROUP BY tab1.id
    HAVING find_in_set
    "Farina"tutti )
    AND 
    find_in_set"Uova"tutti ) =
    ora con PHP è facile aggiungere tanti "find_in_set" quanti me ne servono..

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.