par
VaN » 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.
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 :
[quote]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');[/quote]
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 : /
[php]$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";[/php]
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.