Simplifier une requête MySQL
6 messages
• Page 1 sur 1
- sky
- WRInaute occasionnel

- Messages: 260
- Inscription: 3 Mar 2003
Simplifier une requête MySQL
Bonjour à tous,
Voici ma requête
J'ai donc deux tables : Files et Tags
Un fichier n'a pas forcément de tag.
Du coups, lorsqu'on fais une requête plus simple du genre on n'a pas les fichiers qui n'ont pas de tags. Exemple :
Du à la liaison entre Tags et Files avec file_id, on se prive des fichiers sans tags.
Donc, ma question ?
Est-ce que vous avez une idée de comment simplifier ma 1er requête ?
Voir même une autre façon de voir les choses ?
Merci d'avance,
Sky
Voici ma requête
- Code: Tout sélectionner
SELECT *
FROM Files F
WHERE
F.dom_id='$domid' &&
(
(
EXISTS (SELECT T.tag_name,T.file_id FROM Tags T WHERE T.tag_name LIKE '%$keywords%')
&&
NOT EXISTS (SELECT T.file_id FROM Tags T WHERE T.file_id=(SELECT T.file_id AS TID FROM Tags T WHERE T.tag_name LIKE '%$keywords%'))
)
||
EXISTS (SELECT T.tag_name,T.file_id FROM Tags T WHERE T.file_id=F.file_id && T.tag_name LIKE '%$keywords%')
||
(F.file_name LIKE '%$keywords%' || F.file_description LIKE '%$keywords%')
)
J'ai donc deux tables : Files et Tags
Un fichier n'a pas forcément de tag.
Du coups, lorsqu'on fais une requête plus simple du genre on n'a pas les fichiers qui n'ont pas de tags. Exemple :
- Code: Tout sélectionner
SELECT * FROM Files F, Tags T
WHERE F.dom_id='$domid'
&& (
(F.file_name lIKE '%$keywords%' || F.file_description lIKE '%$keywords%')
||
(T.tag_name lIKE '%$keywords%' && F.file_id=T.file_id)
)
Du à la liaison entre Tags et Files avec file_id, on se prive des fichiers sans tags.
Donc, ma question ?
Est-ce que vous avez une idée de comment simplifier ma 1er requête ?
Voir même une autre façon de voir les choses ?
Merci d'avance,
Sky
- jcaron
- WRInaute accro

- Messages: 2687
- Inscription: 13 Fév 2004
Re: Simplifier une requête MySQL
Pas très clair, et je ne suis même pas sûr que ta requête complète fasse vraiment ce que tu veux.
Pour être sûr de bien comprendre, tu veux les lignes de Files:
- qui "matchent" sur file_name ou file_description;
- ou pour lesquelles il existe un tag qui correspond au mot-clef;
- ou pour lesquelles... ben là c'est pas clair... il n'existe pas de tag? pas de tag qui correspond au mot-clef?
Tu noteras que ton NOT EXISTS est toujours faux s'il existe un seul tag pour le mot-clef, et devrait donner une erreur dans les autres cas (parce que le sub-sub-select renverra 0 lignes ou plus de 1), et que ton EXISTS est vrai s'il existe un tag, donc la combinaison des deux est toujours fausse.
Au passage, en SQL "standard" c'est AND et OR, pas && et ||.
En supposant que tu veux les Files qui n'ont pas de tag associé, je pense que ça devrait marcher:
(je ne t'ai pas mis les autres conditions triviales)
Attention, s'il y a plusieurs tags qui correspondent tu peux avoir plusieurs fois la même ligne de Files. Un petit group by ou distinct pourrait donc s'avérer utile.
Sinon sans join, ce serait plutôt NOT EXISTS (SELECT 1 FROM Tags T WHERE t.file_id=F.file_id), non?
Jacques.
Pour être sûr de bien comprendre, tu veux les lignes de Files:
- qui "matchent" sur file_name ou file_description;
- ou pour lesquelles il existe un tag qui correspond au mot-clef;
- ou pour lesquelles... ben là c'est pas clair... il n'existe pas de tag? pas de tag qui correspond au mot-clef?
Tu noteras que ton NOT EXISTS est toujours faux s'il existe un seul tag pour le mot-clef, et devrait donner une erreur dans les autres cas (parce que le sub-sub-select renverra 0 lignes ou plus de 1), et que ton EXISTS est vrai s'il existe un tag, donc la combinaison des deux est toujours fausse.
Au passage, en SQL "standard" c'est AND et OR, pas && et ||.
En supposant que tu veux les Files qui n'ont pas de tag associé, je pense que ça devrait marcher:
- Code: Tout sélectionner
SELECT * FROM Files F LEFT JOIN Tags T ON (F.file_id = T.file_id) WHERE T.tag_name IS NULL OR T.tag_name LIKE '%$keywords%'
(je ne t'ai pas mis les autres conditions triviales)
Attention, s'il y a plusieurs tags qui correspondent tu peux avoir plusieurs fois la même ligne de Files. Un petit group by ou distinct pourrait donc s'avérer utile.
Sinon sans join, ce serait plutôt NOT EXISTS (SELECT 1 FROM Tags T WHERE t.file_id=F.file_id), non?
Jacques.
- sky
- WRInaute occasionnel

- Messages: 260
- Inscription: 3 Mar 2003
Re: Simplifier une requête MySQL
Bonjour
Merci à tous les deux.
Je revient vers vous dès que j'ai pu mettre vos exemples et conseils en pratique.
La requête actuel semble fonctionner, mais effectivement, pas tjrs évident d'être sur.
J'enrage de ne pas pouvoir tester de suite
Sky
Merci à tous les deux.
Je revient vers vous dès que j'ai pu mettre vos exemples et conseils en pratique.
La requête actuel semble fonctionner, mais effectivement, pas tjrs évident d'être sur.
J'enrage de ne pas pouvoir tester de suite
Sky
- ayor
- WRInaute discret

- Messages: 214
- Inscription: 29 Oct 2008
Re: Simplifier une requête MySQL
Commence par tester la requête de jcaron... j'ai été trop vite en besogne et la mienne sortira en erreur.
il manque juste dedans le test sur le domaine ce qui donne :
SELECT *
FROM Files F
LEFT OUTER JOIN Tags T ON (F.file_id = T.file_id)
WHERE (T.tag_name IS NULL OR T.tag_name LIKE '%$keywords%')
AND F.dom_id='$domid'
il manque juste dedans le test sur le domaine ce qui donne :
SELECT *
FROM Files F
LEFT OUTER JOIN Tags T ON (F.file_id = T.file_id)
WHERE (T.tag_name IS NULL OR T.tag_name LIKE '%$keywords%')
AND F.dom_id='$domid'
6 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- Comment simplifier une double requête SQL?
- Comment simplifier une double requête par jointure?
- [mysql] trier les résultats d'une requête selon une table non liée à la requête
- Requete Mysql ?
- requete Mysql
- Requete MySQL et order
- Requete MYSQL problématique
- Optimiser requête Mysql
- aide requete MYSQL
- [Résolu] Requête MySQL
- Google API : guide de développement de l'API Google - 20-09-2002
- Gestion des langues et des sessions en PHP / MySQL - 02-05-2004
- Passage à l'heure d'été/hiver sur un forum phpBB - 31-10-2010
- Les différents systèmes de mise en cache des données - 16-08-2010
- Nombre moyen de mots par requête : statistiques AOL Août 2006 - 10-08-2006
- Sortie de GoogleStats v2.01 - 02-03-2003
- Nombre de clics dans les pages de résultats : statistiques AOL Août 2006 - 11-08-2006
- Script de mise en cache des pages (PHP MySQL) - 09-08-2010
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités
