Filtrer une requête avec des checkbox
Bonjour à tous,
Mon problème est le suivant. J'ai une base de donnée de plusieurs milliers d'utilisateurs, j'ai un panneau de recherche avec 2 champs input simples. Ce panneau propose aussi une recherche avancée qui vous offre la possibilité de filtrer votre recherche selon les critères cochés. Par exemple, je ne veux que des gens grands ET avec de grande jambes.
Pour ce faire j'utilise un EXIST (SELECT) fois le nombre de checkbox. Pour 500/1000 utilisateurs ok, mais à présent cela ralentit très fortement l'application. Je me tourne vers vous pour une éventuelle solution. J'ai déjà testé quelques solutions et écumé ce bon vieux google mais rien... Une idée? ;)
Ma requête (avec quelques jointures)
Code:
1 2 3 4 5 6 7 8
| SELECT DISTINCT(tb_user.user_id), ...
FROM tb_user
INNER JOIN tb_pictures ON tb_user.user_id = tb_pictures.user_id
INNER JOIN ...
WHERE tb_pictures.picture_select='1' AND tb_user.user_enabled='1' AND tb_user.user_id != 'e38c6ff6c54abb88d6d387d37ca28661' AND tb_search.search_iam = '1' AND tb_search.search_lookfor_boy = '1' AND tb_user.user_birthday <= '19900101' AND EXISTS (SELECT * FROM tb_join_perso WHERE tb_user.user_id = tb_join_perso.user_id AND tb_join_perso.perso_id = 1)AND EXISTS (SELECT * FROM tb_join_perso WHERE tb_user.user_id = tb_join_perso.user_id AND tb_join_perso.perso_id = 2) AND tb_address.country_id = '1' AND tb_cities_us.states_id = '8' LIMIT 0, 9 ; |
Cela m'affiche bien une liste de résultats qui possèdent l'id 1 et 2.
Un ami m'a conseillé ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| SELECT DISTINCT(tb_user.user_id), ...
FROM tb_user, ...
WHERE
tb_user.user_id = tb_pictures.user_id AND
tb_user.user_id = tb_search.user_id AND
...
AND (tb_join_perso.perso_id = 1 AND tb_join_perso.perso_id = 2)
AND tb_address.country_id = '1' AND
tb_cities_us.states_id = '8' LIMIT 0, 9 ; |
La requête s'exécute mais agit comme un OU. J'ai des résultats qui on l'id 1 OU 2 mais pas les 2.
Au final donc, je recherche un moyen de remplacer ces EXIST(). Car ces sous requêtes sont beaucoup trop lourdes...
D'avance merci à vous!