Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/03/2008, 13h52   #1
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
Par défaut [Simple] Une sorte de "contains" amélioré ?

Bonjour à tous !

Je suis plutôt débutant en MySQL, je connais à peu près la base disons.
Voilà l'idée : j'ai un profil utilisateur, celui-ci peut choisir (mettons) des types de films qu'il aime voir, donc plein de checkbox. Et les autres utilisateurs peuvent faire une recherche selon le type de films (plein de checkbox aussi), et j'aimerais que ma requête me retourne l'utilisateur si au moins une des valeurs correspond.

J'avais pensé à ça :
- un champ "usr_movies" dans users de type varchar, qui contiendrait par exemple ",3,5,12,18," (les IDs des types de films qu'il aime, encadrés par des virgules), et ensuite dans ma recherche, si l'utilisateur cherche les IDs 2,3,6,12 :
Code :
1
2
3
4
 
$sReq = 'SELECT usr_id FROM users WHERE ';
foreach ($aSearchedIds AS $iId)
    $sReq .= ' OR usr_movies LIKE "%,' . $sId . ',%"';
(modulo le premier "OR" qui ferait planter la requête, et un tableau vide)

Voila, mais j'ai peur que ce ne soit pas super optimisé.
J'ai vraiment du mal à cerner les mots clefs à rechercher sur google, alors si ici quelqu'un a une idée (idéalement : une technique limite obligatoire tellement elle serait efficient), je suis très preneur

Merci à vous et bonne journée !
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2008, 14h13   #2
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
En fait à la base j'étais parti sur une utilisation de table de jointure (faite à la main, sans clef étrangère quoi)
Du genre :
table movies
id = 1, name = "action"
id = 2, name = "documentaires"

table users_movies
um_usr_id
um_mov_id

Et ensuite dans ma recherche, faire :
Code :
1
2
3
 
$sSearchedIds = implode(',', $aSearchedIds); // donne "1,3,6,12"
$sReq = "SELECT um_usr_id FROM users_movies WHERE um_mov_id IN ($sSearchedIds)";
Toujours modulo un tableau vide.

Voilà, je m'en remets à vous, quelle est la meilleure solution, ou existe t il une autre solution (j'en suis persuadé ) qui soit meilleure, plus rapide, plus "propre"... ?

Merci à vous
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2008, 12h56   #3
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Les jointures et clé étrangères ne sont pas la même chose.
En effet une jointure permet de lier les donnée a l'extraction de celles-ci de la base de donnée.
Les clé étrangères permettre d'avoir plus de contrôle au niveau de la base de donnée. Ce sont ce que l'on appel des contraintes d'intégrité, et comme son nom l'indique ça ne lie pas, çà permet de garantir l'intégrité des données.

Je t'invite a lire mon article qui parle de ca : http://alain-defrance.developpez.com/SGBD/constraint/

Pour ton problème que te donne ce code :

__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2008, 20h02   #4
Membre du Club
 
Inscription : juillet 2006
Messages : 127
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 127
Points : 46
Points : 46
En fait je parlais de table de jointure : une table qui associe à un user plusieurs movies. Il me semble que ça s'appelle comme ça ? Et je sais que pour être plus "secure" il faut utiliser des clefs étrangères comme contrainte d'intégrité oui, ce que je ne fais pas (déjà je suis en MyIsam, parait que c'est plus rapide).

En fait je donnais juste un exemple de code, l'echo de ma requete donnerait un truc du genre :
Code :
1
2
 
SELECT um_usr_id FROM users_movies WHERE um_mov_id IN (1,3,6,12)
Je me posais en fait juste la question de : quelle était la technique la plus utilisée, la plus simple/rapide pour faire ce genre d'opérations : permettre à un utilisateur de cocher plein de choix de films, et ensuite permettre une recherche sur les types de films, et donc faire une sorte d'intersection mathématique, pour retourner les résultats.

Ce que je fais actuellement c'est ça :
table users (usr_id)
table users_movies (um_usr_id, um_mov_id) (et en fait les movies sont définis en PHP, pour éviter des requêtes inutiles pour choper les labels)

Et ensuite je fais la requête comme expliqué plus haut pour choper tous les utilisateurs qui ont au moins un film dans la liste de ceux recherchés (bon ok j'ai oublié le DISTINCT sûrement )

Je voulais savoir s'il y avait mieux et plus optimisé que cette méthode ?

Merci de ta réponse en tous cas !
Lideln est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2008, 20h13   #5
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Autant pour moi je pensais que tu avait un problème dans ta requête.

Je ne trouve pas cette requête sale.

En revanche je suis pas particulièrement pour garder les libellés coté Php pour gagner de la performance.
Il est vrais que la connexion et une requête a une base de donnée est couteuse. Mais d'un autre coté tu ne sais pas trop comment fonctionne php pour récupérer une valeur a un index donné dans un tableau, du coup tu ne sais pas trop ce qu'il se passe coté serveur quand tu récupère ton indexe.
Ce qui est certain en revanche c'est que ton SGBD est fait pour ça, et qu'il le fait donc très bien.
Je ne dis pas que php le fait mal, mais seulement qu'il encaissera peut-être pas de la même manière 20 000 occurrences que MySQL.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 00h20   #6
Futur Membre du Club
 
Inscription : novembre 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 34
Points : 19
Points : 19
Moi je ferais 3 tables
tbl_users
tbl_type_movies
tbl_user_movies (qui rejoint les 2 precedentes)

pour rejoindre un peu ce que dit kazou, l'extraction des donnees c'est MySQL, et le traitement c'est PHP, en segmentant tu evites la redondance, et tu allege le code (1 seul select voir 2, et traitement simplissime en php).
D'autre part avec ton champ usr_movies en VARCHAR, MYSQL recherche à " l'horizontale" et c'est moins rapide que des colonnes (c'est finalemennt comme un champ de type SET ou ENUM)
++
Jean Fi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h13.


 
 
 
 
Partenaires

Hébergement Web