Base de données : requêtes SELECT imbriquées

Ce forum aborde toutes les questions qu'un codeur ou webmaster pourrait se poser, et n'ayant aucun rapport direct avec phpBB.
Tout ce qui peut concerner la récupération des sessions de phpBB sur votre site, doit se faire dans cette section.

Modérateur: Equipe

Règles du forum
A lire impérativement : Règlement de phpBB-fr.com

Base de données : requêtes SELECT imbriquées

Messagepar Feneck91 » 29 Jan 2019 à 23:07

Bonjour à tous et à toutes..

Pour l'extension Introduciator, j'ai besoin de faire un requête me permettant de récupérer des incohérences dans la base de données.
Lorsqu'un utilisateur crée un nouveau sujet dans le forum 'présentation', ceci est considéré comme sa présentation.
Il n'a le droit de se présenter qu'une seule fois, tout les sujet ayant le même posteur sont considérés être autant de présentations.

But de la requête : trouver les doublons (ou plus).
Voici la requête, ici forum_id = 2 est l'identifiant du forum configuré dans l'extension comme étant le forum où les utilisateurs doivent se présenter.

Voici la requête qui fonctionne :
Code: Tout sélectionner
SELECT topic_id, topic_first_post_id, topic_title, topic_visibility, topic_time, topic_poster, topic_first_poster_name, topic_first_poster_colour,
(SELECT COUNT(*) FROM phpbb_topics WHERE phpbbtopics.topic_poster = phpbb_topics.topic_poster AND forum_id = 2) as nb_introduce FROM phpbb_topics as phpbbtopics
WHERE forum_id = 2 AND (SELECT COUNT(*) FROM phpbb_topics WHERE phpbbtopics.topic_poster = phpbb_topics.topic_poster AND forum_id = 2) > 1
ORDER BY topic_poster, topic_time

Un SELECT dans un SELECT, ça fonctionne bien mais le dernier est une clause du WHERE, j'aurais aimé écrire :
Code: Tout sélectionner
SELECT topic_id, topic_first_post_id, topic_title, topic_visibility, topic_time, topic_poster, topic_first_poster_name, topic_first_poster_colour,
(SELECT COUNT(*) FROM phpbb_topics WHERE phpbbtopics.topic_poster = phpbb_topics.topic_poster AND forum_id = 2) as nb_introduce FROM phpbb_topics as phpbbtopics
WHERE forum_id = 2 AND nb_introduce > 1
ORDER BY topic_poster, topic_time

Mais j'ai une erreur : Champ 'nb_introduce' inconnu dans WHERE clause.
Je ne sais pas pourquoi je ne peux pas réutiliser le nb_introduce ?

Voilà l'idée, c'est de checker la base pour que l'administrateur puisse vérifier que les présentations sont correctes, qu'il n'y a pas de doublon....
Feneck91
Maître-posteur
Maître-posteur
 
Messages: 422
Enregistré le: 31 Déc 2007 à 12:02
Localisation: Essonne (91)

Re: Base de données : requêtes SELECT imbriquées

Messagepar ABDev » 30 Jan 2019 à 13:33

Hello,
Il faut utiliser HAVING au lieu de WHERE pour pouvoir filtrer sur une colonne virtuelle.
Un peu plus de détails ici : https://sql.sh/cours/having

Par contre, on ne compte jamais toutes les colonnes (le fait d'utiliser *). On définit toujours une colonne.
Dans le cas présent, il est préférable de compter sur le colonne topic_id.
Pour se payer le luxe d'être feignant, il faut sans cesse faire travailler ses méninges ! (Korben)

On clique sur le bouton Répondre plutôt que le bouton Citer ...
Un problème avec une extension ? Pas de lien vers celle-ci ? Sujet ignoré !
Avatar de l’utilisateur
ABDev
Programmationateur
Programmationateur
 
Messages: 15709
Enregistré le: 12 Mai 2005 à 22:54

Re: Base de données : requêtes SELECT imbriquées

Messagepar Feneck91 » 30 Jan 2019 à 21:57

Merci beaucoup, c'est juste excellent !!

En fait je me pose pas mal de question sur la procédure à suivre, je veux utiliser :
Code: Tout sélectionner
	<div class="pagination top-pagination">
		{% if loops.pagination|length %}
		{% INCLUDE 'pagination.html' %}
		{% else %}
		&bull; {{ PAGE_NUMBER }}
		{% endif %}
	</div>

Ça permet d'avoir un tableau avec des pages. Pourquoi ? Si dans un forum il y a beaucoup de gens qui ont postés leur présentations plusieurs fois, hors de question de tout afficher sur une seule page (quoique...)
Donc, il faudrait que :
  • je compte le nombre d'utilisateurs ayant postés plus de sujet dans le forum de présentation
  • Puis que je récupère la liste des utilisateurs avec $db->sql_query_limit pour ne récupérer que la page en cours
  • Puis sur chaque utilisateur, que je récupère la liste des posts de présentation en doublon, triplon, quadruplon...
C'est un peu long mais c'est le seul moyen que j'ai trouvé qui me permette d'avoir un système de page propre. Si le récupère via la première requête donné ici, je risque de retrouver les posts d'un même utilisateur sur deux pages consécutives et ça c'est pas bien...

Si vous avez une autre idée...

Tient au fait, ABDev, ça faisait un moment que je ne t'avais pas vu. Tu n'as pas repris ton MOD qui permettait de mettre des annotations sous les sujets, bien utilise pour les modérateurs ? Je crois que tu avais dit que tu en avais marre et que tu ne le supportais plus mais comme ça fait quelques années, tu as pu changer d'avis...
En tout cas merci pour ta réponse, j'ai appris quelque chose...
Feneck91
Maître-posteur
Maître-posteur
 
Messages: 422
Enregistré le: 31 Déc 2007 à 12:02
Localisation: Essonne (91)


Retourner vers Coding, Webmastering et Sécurité informatique

 


  • Articles en relation
    Réponses
    Vues
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités