[bglug] Mysql query

Alberto Bonacina bonacina.alberto@gmail.com
Sab 5 Nov 2016 09:36:18 CET


Il 5 novembre 2016 08:07, Roberto Santini
<roberto.santini89@gmail.com> ha scritto:
> Ora, ho predisposto un Form in cui posso selezionare gli utenti facendo un
> filtro su queste specifiche: posso selezionare quale spec filtrare e quale
> valore debba avere. Finché si tratta di una sola specifica non c'è problema.
> Quando sono più d'una però non so bene come fare. Se faccio:
>
> SELECT * FROM user u JOIN spec_values s ON.... WHERE (s.id_spec=1 and
> s.value=...) OR (s.id_spec=2 and s.value=...)
>
> ottengo gli utenti che hanno id_spec=1 O id_spec=2. Io voglio che valgano
> entrambe le condizioni, ma ovviamente se metto AND tra le due parentesi non
> ottengo nessun risultato. Ho provato anche utilizzando le sub query ma senza
> successo.

Quindi se ho capito bene tu vuoi farti ritornare gli utenti che
abbiamo a TRUE tutte le n condizioni che hai messo in quella form,
giusto?

Lo devi fare per forza con una query _tutto compreso_ o puoi anche
usare un certo qualche linguaggio? Tipo javascript o PHP?
In questo caso potresti farti ritornare una "struttura" in cui hai la
lista delle spec_id<->valori che tu hai cercato e allegato la lista
degli utenti che rispettano la singola condizione, successivamente
cerchi se ci sono degli utente che appartengono tutte queste liste. Ti
scrivo questa struttura in JSON

{
  "ricerca" : [
      { "id_spec" : 1,
          "value": "email_cercata",
          "utenti" : [1,2,3,4,5,6]
      },
     {
          "id_spec" : 2,
          "value": "telefono_cercato",
          "utenti" : [3,5,8,9,10]
      }
   ],
   "utenti" : [    //queste sono le info degli utenti che ci sono nei
vari array di sopra
        {"user_id": 1, "name" : "nomeUtente1"},
         .....
         {"user_id": 10, "name" : "nomeUtente1"},
    ]
}

a questo punto gli utenti che tu vuoi, se ho capito bene, dovrebbero
essere 3 e 5, di cui l'array _utenti_ nella risposta ti dice come si
chiamano. Questa soluzione è un po' ibrida nel senso che hai la
generazione della struttra lato server, e poi la ricerca lato client.
Altrimenti potresti fare tutto lato server e rispondere direttamente
con la lista degli utenti. Secondo me la soluzione tutta query è più
complicata che la stessa ricerca fatta con php/javascript.

> Secondo me dovresti cambiare la condizione WHERE della tua query con l'operatore "IN".
> Dovresti recuperare dalla tua form la lista degli id_spec selezionati e poi impostare una condizione del tipo:
> WHERE s.id_spec IN ( 1, 2, 8,.... )

Anche io avevo pensato una IN, il problema è che così prendi gli
utenti che hanno un qualche valore in quell'insieme di spec, dopo però
li devi filtrare di nuovo per quelli che hanno tutte le spec che la
form ha richiesto e successivamente controllare che siano uguali i
valori di quelle spec... e che siano tutti uguali.


-- 
Bonacina Alberto
Website: www.albertobonacina.com


Maggiori informazioni sulla lista bglug