<p dir="ltr">Interessante l'ultima soluzione, ma mi sembra un po troppo macchinosa. In attesa di provare ed eventualmente passare a MongoDb, per ora ho risolto così: <br>
- data la lista completa degli utenti, per ogni utente cerco la lista degli attributi con id_spec, id_user e value assegnati. <br>
- se l'array che trovo ha almeno un elemento, l'utente soddisfa per ora i requisiti del filtro. <br>
- se l'array ha dimensione 0, sicuramente l'utente non soddisfa le richieste, quindi interrompo la ricerca degli attributi per quell'utente (i filtri devono valere tutti contemporaneamente). <br>
- alla fine della ricerca so se quell'utente soddisfa i criteri o meno, quindi se lo mostro nella tabella o no. </p>
<p dir="ltr">Soluzione abbasta semplice ma mi rendo conto lunga e dispendiosa... su 100 utenti con 2 filtri devo eseguire al massimo 200 query. </p>
<p dir="ltr">Grazie <br>
Roberto </p>
<div class="gmail_extra"><br><div class="gmail_quote">Il 07 Nov 2016 9:31 AM, "Alberto Bonacina" <<a href="mailto:bonacina.alberto@gmail.com">bonacina.alberto@gmail.com</a>> ha scritto:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Il 5 novembre 2016 08:07, Roberto Santini<br>
<<a href="mailto:roberto.santini89@gmail.com">roberto.santini89@gmail.com</a>> ha scritto:<br>
> Ora, ho un database con le seguenti tabelle:<br>
> - user: id, name<br>
> - spec: id, label<br>
> - spec_values: id, id_user,id_spec, value.<br>
<br>
Volendo potresti aggiungere alla tabella user un campo che ti dice<br>
quali sono le spec che l'utente ha abilitato/creato (di cui ha un<br>
valore nella tabella spec_values), questo potrebbe essere fatto con<br>
una lista di id separati da virgola oppure con un campo testuale e poi<br>
salvare un array con il serialize/unserialize di PHP.<br>
Perchè farlo? In questo modo puoi prima cercare gli utenti che hanno<br>
quel/quei valore/i settato/i, indipendentemente dal valore effettivo<br>
dello spec, e poi cercare gli effettivi valori solo tra quelli in cui<br>
ha senso cercare.<br>
<br>
Per vedere quali hanno quelle spec nel caso tu abbia utilizzato la<br>
lista di spec_id separati da virgola puoi usare il costrutto<br>
FIND_IN_SET di SQL e usare l'AND in questo modo<br>
<br>
SELECT * FROM user WHERE ( FIND_IN_SET (first_spec_id,user.spec_list)<br>
AND .... AND (nth_spec_id,user.spec_list));<br>
<br>
Una cosa a cui stare un attimo attenti è quando l'utente aggiorna la<br>
sua lista di spec in quanto si deve andare a modificare la tabella<br>
spec_values ma anche la lista di spec nella tabella user.<br>
<br>
--<br>
Bonacina Alberto<br>
Website: <a href="http://www.albertobonacina.com" rel="noreferrer" target="_blank">www.albertobonacina.com</a><br>
<br>
--<br>
Sito BgLUG: <a href="http://www.bglug.it" rel="noreferrer" target="_blank">http://www.bglug.it</a><br>
Mailing list: <a href="http://lists.linux.it/listinfo/bglug" rel="noreferrer" target="_blank">http://lists.linux.it/<wbr>listinfo/bglug</a></blockquote></div></div>