Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels 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 03/01/2011, 18h51   #1
Membre régulier
 
Inscription : avril 2003
Messages : 322
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 322
Points : 79
Points : 79
Par défaut LIMIT sur un "faux GROUP BY"

Bonjour,

Question récurrente visiblement...
Est-il possible de faire un LIMIT sur un "faux GROUP BY" ?

Exemple d'un résultat de requête sur une jointure.
Code :
1
2
3
4
5
SELECT user_id, tas_id
FROM user 
INNER JOIN task
ON user_id = use_id
WHERE...
Code :
1
2
3
4
5
6
7
8
9
[USER] [TASK]
  1        1
  1        2
  1        3
  2        1
  2        2
  3        1
  4        1
  4        2
L'objectif est de récupérer seulement les résultats concernant les deux premiers utilisateurs.


Code :
1
2
3
4
5
6
[USER] [TASK]
  1        1
  1        2
  1        3
  2        1
  2        2
Il faut imaginer qu'il existe 50 conditions WHERE au niveau de TASK dans la requête.

Une solution, une idée ? Merci

Dorian
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 23h45   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 766
Points : 17 766
La solution est simplissime avec les fonctions de fenêtrage :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT *
FROM
(
SELECT user_id, tas_id...,
       ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY tas_id) AS N
FROM   ....
       ...
WHERE  ...
) AS T
WHERE N <= 3
A lire : http://sqlpro.developpez.com/article...clause-window/

Sauf Que MySQL, cet Ersatz de SGBDR ne les implémente toujours pas !!!
Bref, passez à PostGreSQL... Vous aurez moins d'emmerde et en plus c'est gratuit, alors que MySQL est payant !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 00h05   #3
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
On aurait peut être pu écrire ceci aussi (certainement beaucoup moins bien):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
SELECT user_id, tas_id
FROM user 
INNER JOIN task
ON user_id = use_id
WHERE...
 
AND user_id ON 
(
SELECT user_id
FROM user
INNER JOIN task
ON user_id = use_id
WHERE...
GROUP BY user_id
LIMIT 2
)
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 08h45   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Citation:
L'objectif est de récupérer seulement les résultats concernant les deux premiers utilisateurs.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 09h13   #5
Membre régulier
 
Inscription : avril 2003
Messages : 322
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 322
Points : 79
Points : 79
Oui David55, je crains qu'il n'y ait pas d'autres solutions.

CinePhil, les deux premiers utilisateurs du jeu de résultats (pas par rapport aux id), et de toute manière on est obligé de conserver le WHERE sur TASK.

Merci à vous
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 09h31   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par dorian53 Voir le message
CinePhil, les deux premiers utilisateurs du jeu de résultats (pas par rapport aux id),
Qu'est-ce qui détermine que ce sont les deux premiers ?

Citation:
et de toute manière on est obligé de conserver le WHERE sur TASK.
Citation:
Il faut imaginer qu'il existe 50 conditions WHERE au niveau de TASK dans la requête.
Ça fait beaucoup ! On peut avoir la requête complète ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 09h57   #7
Membre régulier
 
Inscription : avril 2003
Messages : 322
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 322
Points : 79
Points : 79
Citation:
Envoyé par CinePhil Voir le message
Qu'est-ce qui détermine que ce sont les deux premiers ?
C'est bien ça mon problème, j'aimerais pouvoir faire un
Code :
LIMIT 0, 2 sur un GROUP BY user_id
Pour répondre à la logique de l'ordre, peu importe, uniquement l'ordre du résultat de la requête. C'est pour faire de la pagination par USER.

Citation:
Envoyé par CinePhil Voir le message
Ça fait beaucoup ! On peut avoir la requête complète
C'est pour l'exemple d'un moteur de recherche et poser la problématique pour ne pas qu'on me propose une sous requête avec un IN comme solution.
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 10h21   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
La pagination, c'est de la présentation. C'est donc le boulot du logiciel, pas du SGBD !

Si ta requête retourne dans l'ordre {12, 24, 25, 28...}. Tu vas afficher les données de 12 et de 24. Puis avant que l'utilisateur ne demande la page suivante, de nouvelles données sont arrivées qui font que maintenant la requête donne dans l'ordre {3, 12, 15, 24, 25, 27...}. Tu vas afficher quoi ? 15 et 24 alors que l'utilisateur a déjà vu 24 ? 3 et 12 parce que maintenant ce sont les deux premiers et alors que 12 a déjà été vu par l'utilisateur ?

Il faut que le logiciel récupère la totalité du résultat de la requête, affiche les résultats de la première page et mémorise en session le jeu de résultats et là ou il en est de la pagination.

Quant au "moteur de recherche" tellement à la mode, il existe chez MySQL la recherche FULLTEXT qui peut éviter d'avoir un WHERE à rallonge.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h19   #9
Membre régulier
 
Inscription : avril 2003
Messages : 322
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 322
Points : 79
Points : 79
La session est intéressante mais pas sur plusieurs centaines de millier de résultats (c'est mon cas). Je ne peux pas tout retourner à chaque fois et réaliser le traitement côté code, c'est très lourd. Donc dans ton exemple, oui on ré-afficherait 15-24.

Le "moteur de recherche" est un formulaire qui propose plusieurs paramètres, donc pas de FULLTEXT envisageable trop de critères sur des dates, intervalles, sum, etc... ça reviendrait à ré-écrire un moteur de requêtes pour générer la bonne recherche (et en plus fulltext n'existe pas en innoDb, je serais obligé de faire une table à part).
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 16h38   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Tu ne veux toujours pas donner ta vraie requête et son objectif ?
On ne peut pas t'aider davantage sans plus de renseignements.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 16h59   #11
Membre régulier
 
Inscription : avril 2003
Messages : 322
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 322
Points : 79
Points : 79
C'est pas que je ne veux pas, c'est qu'elle n'apporte rien au problème.
La requête est construite par le code il y a plus de 100 lignes et x jointures qui ne font que compliquer la résolution d'un problème aussi simple que :

Citation:
J'AI DES THEMES ET DES LIVRES (1 livre = 1 thème, 1 thème = n livres),
JE VEUX PAGINER LES LIVRES PAR THEME (10 PAR 10) QUI REPONDENT AUX CRITERES DE LIVRE SUIVANTS...
THEME 1
> Livre 1
> Livre 2
> Livre 3
> Livre ..
> Livre N
THEME 2
> Livre 42
THEME 10
> Livre 4

Exactement pareil que USER et TASK.
dorian53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h16.


 
 
 
 
Partenaires

Hébergement Web