Requête que je n'arrive pas à formuler

VaN
Mammouth du PHP | 1107 Messages

10 déc. 2008, 19:08

Bonjour,

Ce que je souhaite faire est à priori assez simple, mais j'ai l'impression que la requête pour y arriver est compliquée.

Voici mes deux tables :
CREATE TABLE `annonces_positions` (
`position_id` int(11) NOT NULL auto_increment,
`position_name` varchar(30) NOT NULL,
PRIMARY KEY (`position_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Contenu de la table `annonces_positions`
--

INSERT INTO `annonces_positions` (`position_id`, `position_name`) VALUES
(1, 'Normale'),
(2, 'Promotions'),
(3, 'Nouveautés');

CREATE TABLE `packs` (
`pack_id` int(11) NOT NULL auto_increment,
`pack_annonce_id` int(11) NOT NULL,
`pack_position` tinyint(4) NOT NULL,
`pack_startdate` datetime NOT NULL,
`pack_enddate` datetime NOT NULL,
PRIMARY KEY (`pack_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Contenu de la table `packs`
--

INSERT INTO `packs` (`pack_id`, `pack_annonce_id`, `pack_position`, `pack_startdate`, `pack_enddate`) VALUES
(1, 1, 2, '2008-12-09 16:46:00', '2008-12-11 16:46:11'),
(2, 2, 2, '2008-12-07 17:40:04', '2008-12-16 17:40:15');
Ce que je souhaite faire :
Lorsqu'un utilisateur insère une annonce dans ma base de données, je lui donne la possibilité de choisir un emplacement privilégié (il s'agit de la table ANNONCES_POSITIONS), contre paiement.
Si l'utilisateur choisit d'être placé dans un des deux emplacements 'Nouveautés" ou "Promotions", j'insère ce choix dans la table PACKS. La où ça se complique, c'est qu'il ne doit pas y avoir plus de 12 enregistrements pour l'emplacement "Nouveautés", à une date D.
Donc au moment où je propose à l'utilisateur d'être placé en "Nouveautés" ou "Promotions", il faut d'abord que je teste combien d'autres annonces sont placées en "Nouveautés" et "Promotions", à cette date présente. Si il y'en a moins de 12 pour "Nouveautés", il peut s'y inscrire. de même pour "Promotions".

Au final, je veux que ma requête me sorte un tableau, comportant le champ position_id des positions ("Nouveautés", "Promotions") autorisées, au moment où l'utilisateur souhaite s'y inscrire. Car à partir de ce tableau PHP, je vais générer un <select> à partir duquel l'utilisateur choisit à quel endroit il veut être positionné ("Nouveautés" ou "Promotions"). Ainsi, si il y'a deja 12 annonces placées actuellement en "Nouveautés", la requete ne va renvoyer que l'id de l'emplacement "Promotions", et le <select> ne comportera que cette option là).

Voilà mon début de requete, mais qui est surement très mal pensé, car mon cerveau s'embrouille complètement : /
$sql = "SELECT position_id FROM ".$cfg_prefixe."annonces_positions
			LEFT JOIN ".$cfg_prefixe."packs ON pack_position = position_id
			WHERE position_id != 1
			AND (SELECT COUNT(pack_id) as nb FROM ".$cfg_prefixe."packs
			WHERE pack_startdate < '".date('Y-m-d H:i:s')."' AND pack_enddate > '".date('y-m-d H:i:s')."') < 12
			GROUP BY position_id";
En relisant, ca à l'air tout confus, alors j'espère que quelqu'un va plus ou moins comprendre ce que je souhaite réaliser.

Eléphant du PHP | 422 Messages

11 déc. 2008, 13:06

car mon cerveau s'embrouille complètement
Effectivement, quand on a la tête dans le guidon, on a du mal à prendre le recul nécessaire.
Je n'ai effectivement pas tout compris, mais j'ai l'impression que tu essayes de faire un peut tout en même temps et de tout confier à SQL.

Un conseil que je donne aux développeurs de mon équipe quand ils arrivent avec des problèmes comme ça, c'est
1) d'aller prendre l'air (mais pas trop longtemps, faut pas exagérer non plus)
2) d'avancer petit à petit
3) reporter sur PHP des choses qui pourraient être faites en SQL

Donc, fais ton select sans t'occuper des count, des 12, ... et traite ça dans le PHP. Une fois que tu l'auras fait, peut-être que tu verras comment réintégrer tout ça en SQL (ou peut-être pas).

Ce qu'il y a également, c'est qu'il est possible que la base soit mal conçue au départ. Pose-toi la question de savoir s'il ne faut pas, à l'enregistrement d'une annonce, incrémenter un compteur ou un champ avec le nombre et la position.

Bon courage

VaN
Mammouth du PHP | 1107 Messages

11 déc. 2008, 14:50

Merci beaucoup. Effectivement, j'étais le nez dans le guidon, et je n'avais pas pensé à faire travailler PHP pour arriver à ce résultat.

Et finalement, c'est devenu beaucoup plus facile ! En quelques lignes, j'ai réussi à récupérer le tableau dont j'avais besoin : )
$positions = getDataFromQuery("SELECT position_id, position_name FROM ".$cfg_prefixe."annonces_positions WHERE position_id != 1");
			
			foreach($positions as $key => $position) {
				$occurence = getValueFromQuery("SELECT COUNT(pack_id) FROM ".$cfg_prefixe."packs WHERE pack_position = '".$position['position_id']."'");
				if($occurence > 12) {
					unset($positions[$key]);
				}
			}
Sujet résolu. Merci.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

11 déc. 2008, 18:01

Modération :
VaN (avec 898 messages), si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

VaN
Mammouth du PHP | 1107 Messages

11 déc. 2008, 19:25

Oui désolé Truc, j'allais le faire évidemment, mais j'ai dû changer d'onglet pendant le chargement de la page, pensant y revenir dans 2 secondes pour mettre le tag, et ça m'est sorti de la tête aussitôt.