Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 08/11/2011, 22h34   #1
Invité régulier
 
Inscription : avril 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 34
Points : 8
Points : 8
Par défaut Transformer plusieurs SELECT sur une table en une seule requête

Bonjour à tous, et merci d'accorder un peu de votre temps à mon problème.

Voilà, j'ai actuellement une requête qui marche parfaitement et qui fait ce que je lui demande ( j'extrais des topics d'un forum PHPBB pour les afficher sur une autre page ) :

Code :
1
2
3
4
5
6
 
SELECT t.topic_title, t.topic_id, t.topic_first_poster_name, t.topic_time, t.topic_replies, t.topic_poster, t.topic_first_post_id, t.forum_id, p.post_text, u.topic_id AS publication
 
FROM phpbb_topics t LEFT JOIN phpbb_posts p ON(t.topic_first_post_id=p.post_id) LEFT JOIN site_publications u ON(t.topic_id=u.topic_id)
 
WHERE t.forum_id=4 OR t.forum_id=15 OR t.forum_id=16  ORDER BY t.topic_time DESC LIMIT 0,9
La requête m'affiche bien les 10 derniers topics créés, qu'ils soient dans le forum 4 , 15 ou 16. Il m'en affiche 10 (limit 0,9).

Jusque-là, aucun souci.

Le problème étant que je voudrais sélectionner 10 topics du forum 4, 10 topics du forum 15 et 10 topics du forum 10 ( en clair 30 topics divisés sur 3 forums, soit 10 topics par forum).

Evidemment, la solution bête et méchante et pas optimisée serait de faire 3 SELECT avec un WHERE : t.forum_id=numero du topic comme condition.


Sauf que je me retrouverais avec 3 requêtes SQL, et je ne veux pas. Je voudrais pouvoir sélectionner les 10 derniers topics de chaque forum mais en une seule requête.

J'ai regardé sur le forum, testé des UNIONS, essayé de voir avec des tables temporaires, mais au final je n'arrive à rien et je ne suis totalement perdu.

Merci d'avance pour votre aide
Slaash0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 11h22   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 431
Points : 6 431
Bonjour,

Inspire-toi de l'exemple présenté dans les sources MySQL : http://mysql.developpez.com/telechar...aque-categorie

Ça devrait correspondre à ce que tu recherches.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 13h07   #3
Invité régulier
 
Inscription : avril 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 34
Points : 8
Points : 8
Merci, je regarde ça, je tente de comprendre et de créer un code, et je reviens
Slaash0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 13h12   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 431
Points : 6 431
L'idée n'est pas de créer des catégories (qui sont un exemple dans le code source). Dans le cas présent, l'idée est de remplacer la notion de catégorie dans le requête du code source par la notion de forum dans ta requête.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 13h21   #5
Invité régulier
 
Inscription : avril 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 34
Points : 8
Points : 8
Ok je vois, c'est un peu plus clair. Je bosse dessus là
Slaash0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 16h39   #6
Invité régulier
 
Inscription : avril 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 34
Points : 8
Points : 8
Bon ba en faite non , j'ai essayé plusieurs choses, mais il y'a quelque chose que je comprend pas : le SELECT COUNT() dans le WHERE, et le < n dans l'exemple. Je ne comprends pas l'utilité dans la requête ?
Slaash0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h24   #7
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 431
Points : 6 431
Je suppose que les identifiants de topics sont classés par ordre croissant de création des topics.
Sans avoir testé, la requête suivante devrait s'approcher de ce que tu souhaites obtenir :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT t.topic_title, t.topic_id, t.topic_first_poster_name, t.topic_time, t.topic_replies, t.topic_poster, t.topic_first_post_id, t.forum_id, p.post_text, u.topic_id AS publication
FROM phpbb_topics t 
LEFT JOIN phpbb_posts p ON (t.topic_first_post_id=p.post_id) 
LEFT JOIN site_publications u ON(t.topic_id=u.topic_id)
WHERE t.forum_id IN (4, 15, 16)
AND (
	SELECT COUNT(*)
	FROM phpbb_topics t1
	WHERE t1.forum_id = t.forum_id
	AND t1.topic_id > t.topic_id
) < 10
ORDER BY t.topic_time
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h37   #8
Invité régulier
 
Inscription : avril 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 34
Points : 8
Points : 8
Non je me retrouve avec tous les Topics de chaque forum. Donc une grosse quantité au lieu de 10 par forum.

Je suis en train de faire des tests avec des BEETWEEN, je sais pas ce que ça va donner. Parce que j'ai beau chercher je comprend pas à quoi sert le SELECT COUNT dans l'exemple que tu m'as donné :/
Slaash0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h51   #9
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 431
Points : 6 431
Le SELECT COUNT permet, pour chaque topic, d'aller chercher le nombre de topics qui sont dans le même forum (d'où l'égalité sur les forum_id dans la sous-requête), mais avec un identifiant supérieur au topic.
Et on limite le résultat aux topics qui ont moins de 10 topics qui leur sont postérieurs...

C'est curieux que ça renvoie tous les topics d'un forum...
On peut avoir un jeu d'essai ?
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h57   #10
Invité régulier
 
Inscription : avril 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 34
Points : 8
Points : 8
Je n'ai rien dis, c'est moi qui doit merdé dans mon affichage, ça renvoie bien 30 résultats, 10 par forum ! J'ai vérifié avec php_my_admin.

Je vais malgré tout me pencher sur cette histoire de COUNT histoire de bien saisir, parce qu'avoir le résultat c'est bien, mais le comprendre c'est mieux

Merci encore, je vais noter le topic en résolu
Slaash0 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 10h23.


 
 
 
 
Partenaires

Hébergement Web