J'ai 2 tables :
1 table "membre" où j'enregistre pour chaque membre le numéro de la campagne suivie par le membre.
1 table "campagne" où j'indique le numero de la campagne (différent de l'id) et combien de membres max sont autorisés dans la campagne..
Pour trouver le nombre d'inscrits d'une campagne je fais simplement ceci :
$sql = 'SELECT COUNT(*) FROM membres WHERE numcampagne = ' . $numerocampagne . '';
Là où je bloque c'est que j'aimerais trouver la requête pour afficher le numéro de la campagne ayant le plus d'inscrits... mais qui ne soit pas encore complètes donc (< membremax)
Voici la structure des tables
Structure (partielle) de la table campagne
Champ Type
ID int(2)
membremax int(5)
numero int(2)
Structure (partielle) de la table membres
Champ Type
id int(5)
numcampagne tinyint(2)
Et voilà où j'en suis... c'est ma première tentative de jointure alors soyez sympa :-)
SELECT t.numero
FROM
campagne AS t
JOIN
membres AS p
ON
t.numero = p.numcampagne
GROUP BY t.numero
having count(*)= select max(count(p.numcampagne) from membres
Voilà où j'en suis et évidemment la dernière ligne ne plait pas du tout au sql.. :-(
Alors d'abord une remarque de méthode : si tu veux qu'on puisse t'aider facilement, il faut qu'on puisse tester facilement les suggestions qu'on te fait, sur un serveur SQL. Donc il faut que tu fournisses du code pour :
- créer les tables (c'est bien de donner leur structure, mais la requête de création SQL directement exécutable ça nous donne moins de travail)
- remplir les tables avec un peu d'information pour tester (deux ou trois lignes de chaque)
Tu n'as pas donné ces informations, alors les gens vont te donner des requêtes qu'ils n'auront pas testé.
SELECT
campagne.numero,
COUNT(membres.id) as nb_membres
FROM
membres
JOIN campagne ON membres.numcampagne = campagne.numero
GROUP BY campagne.numero
WHERE COUNT(membres.id) < campagne.membremax
ORDER BY COUNT(membres.id) DESC
LIMIT 1
je rentre du travail.. et je dois bientôt y repartir....
Voici le fichier pour créer les tables
-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Ven 18 Mars 2011 à 13:01
-- Version du serveur: 5.1.36
-- Version de PHP: 5.3.0
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `xxxxxx`
--
-- --------------------------------------------------------
--
-- Structure de la table `campagne`
--
CREATE TABLE IF NOT EXISTS `campagne` (
`ID` int(2) NOT NULL AUTO_INCREMENT,
`membremax` int(5) NOT NULL,
`description` varchar(150) NOT NULL,
`tempspremium` varchar(6) NOT NULL,
`type` varchar(10) NOT NULL,
`numero` int(2) NOT NULL,
`tempsfree` varchar(6) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
-- --------------------------------------------------------
--
-- Structure de la table `membres`
--
CREATE TABLE IF NOT EXISTS `membres` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`nom` varchar(21) NOT NULL,
`pass` varchar(40) NOT NULL,
`email` varchar(60) NOT NULL,
`envoi_etat` int(1) NOT NULL DEFAULT '0',
`dateenregistrement` int(15) NOT NULL,
`IP` varchar(15) NOT NULL,
`numcampagne` tinyint(2) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=12156 ;
Heu je ne savais pas comment rajouter quelques enregistrements avec....
Cette requete =>
SELECT
campagne.numero,
COUNT(membres.id) as nb_membres
FROM
membres
JOIN campagne ON membres.numcampagne = campagne.numero
GROUP BY campagne.numero
WHERE COUNT(membres.id) < campagne.membremax
ORDER BY COUNT(membres.id) DESC
LIMIT 1
Me renvoit une erreur :
near 'WHERE COUNT(membres.id) < campagne.membremax ORDER BY COUNT(membres.id) DESC L' at line 8
Pour corser le tout, j'aurais aimer rajouter un critère sur le type de la campagne qui est soit "Free" soit "Premium"
Donc pour résumer au final :
Je voudrais rechercher la campagne de type "Free" (par exemple) qui a le plus de membres mais qui n'est pas encore complète donc inférieure à membremax.
Je ne pense pas que ça soit la raison de ton erreur, mais il faut aussi grouper sur campagne.membremax :
SELECT
campagne.numero,
COUNT(membres.id) as nb_membres
FROM
membres
JOIN campagne ON membres.numcampagne = campagne.numero
GROUP BY campagne.numero, campagne.membremax
WHERE COUNT(membres.id) < campagne.membremax
ORDER BY COUNT(membres.id) DESC
LIMIT 1
Merci pour votre aide mais j'ai toujours le même message d'erreur
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE COUNT(membres.id) < campagne.membremax ORDER BY COUNT(membres.id) DESC L' at line 8
à cause de cette ligne
WHERE COUNT(membres.id) < campagne.membremax
Si j'enlève cette ligne la requête est exécutée.... si quelqu'un a une idée de ce qui bloque...
Pour commencer avec les jointures je ne suis pas allé au plus simple...
SELECT
campagne.numero,
COUNT(membres.id) as nb_membres
FROM
membres
JOIN campagne ON membres.numcampagne = campagne.numero
GROUP BY campagne.numero, campagne.membremax
HAVING COUNT(membres.id) < campagne.membremax
ORDER BY COUNT(membres.id) DESC
LIMIT 1
Un grand merci pour cette requête qui fonctionne parfaitement!!!
Union avec max(count)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Tutoriel complet MySQL !