• Super User

    Ciao portapipe
    voglio una query che restituisce il codice delle birre (codBirre) che piacciano a tutti i bevitori (codBev)

    Esempio
    birra(1,Light,Moretti)
    birra(2,Light,Tuborg)

    piace(1,1)
    piace(2,2)
    piace(2,1)

    In questo esempio il codice da restituire è 1 perchè la birra 1 piace sia al bevitore 1 che al bevitore 2 quindi a TUTTI i bevitori

    Spero di essere stato chiaro


  • User Attivo

    Non ho capito la storia dei bevitori.
    piace(1,1)
    piace(2,2)
    piace(2,1)
    cosa significano rispettivamente?

    dai che ci arriviamo! 🙂


  • Super User

    piace (1,1) vuol dire che al bevitore con codice 1, piace la birra con codice 1 ecc...


  • User Attivo

    Ok.
    Puoi creare una query per l'estrazione delle birre ed una per il numero di utenti

    SELECT * FROM birre
    SELECT * FROM utenti

    $numutenti=mysql_num_row($queryutenti);

    //Poi crei l'array delle birre
    while($array=mysql_fetch_array($querybirre)){

    //e dentro ci metti una seconda query per estrarre il numero di utenti a cui piace la birra che gira nel ciclo while in quel momento
    SELECT * FROM piace WHERE codBir='$array['codBir']
    $numpiace=mysql_num_rows($querypiace);

    //e qui ti crei una condizione per la quale se il numero di record dell'ultima query è inferiore a quella degli utenti, non si vede nulla
    if($numpiace==$numutenti){

    //visualizza le birre
    }


  • Super User

    Grazie per il tempo Portapipe ma purtroppo non posso utilizzare nessun linguaggio di programmazione.

    Devo fare una query in sql che restituisca il risultato senza alcuna implementazione in nessun linguaggio.

    Io credo di dover fare un Join tra le tabelle piace e birre e all'interno delle birre utilizzare un Alias per confrontare che il codice di birra sia lo stesso ma che il codBev sia diverso ma non mi arriva la capa 😉


  • User Attivo

    Specificarlo prima? :dull:

    Devi farti una query con JOIN ma non puoi calcolare tutto da una singola query. Anche solo per calcolare il numero di record hai bisogno di una funzione esterna.
    Va bene accorciare il tutto ma ci sono dei limiti 😉


  • Super User

    @portapipe said:

    Specificarlo prima? :dull:

    Ho detto di dover fare una query nel primo post credevo fosse chiaro :rollo:

    Comunque credo di aver risolto così
    SELECT codBirra FROM birra
    WHERE codBirra = ALL (SELECT codBirra FROM piace);

    Ora controllo meglio ma sembra restituire il giusto


  • User Attivo

    :surprised:
    Esiste un ALL () ?
    Vedi, il bello del forum è imparare.. 🙂

    Comunque dire che devi fare una query o che puoi fare soltanto una query è differente 😉


  • Super User

    Si esiste ALL senza parentesi perchè non è una funzione; le parentesi racchiudono una subquery.

    Ciao a grazie per l'interessamento


  • Super User

    Correggo:

    SELECT codBirra FROM birra
    WHERE codBirra = ALL (SELECT p1.codBirra FROM piace AS p1, piace AS p2
    WHERE p1.codBev <> p2.codBev
    AND p1.codBirra = p2.codBirra);

    Prima verificava se la birra piaceva a tutti ma nessun bevitore piaceva un altra birra 😉

    Ora è ok


  • ModSenior

    Ciao Calabria,

    sei sicuro che in quel modo funzioni?
    Da quello che sò io, non dovrebbe comportarsi come chiedevi tu, infatti ho fatto una prova cosi:
    In birra ho messo:

    • birra 1
    • birra 2
      Tabella piace:
    • utente 1 birra 1
    • utente 2 birra 1
    • utente 2 birra 2

    In questo caso a tutti gli utenti piace la birra 1, ma con quella query non funziona perchè è sufficiente che ad un utente piaccia una birra diversa perchè non restituisca nulla.

    EDIT: Sono arrivato tardi :), ma anche questa query mi sembra non vada bene se infatti provi con questi dati:
    In birra:

    • birra 1
    • birra 2
      piace:
    • utente 1 birra 1
    • utente 2 birra 1
    • utente 2 birra 2
    • utente 1 birra 2

    Mi sembra dia risultati inaspettati