Bonjour,

J'ai 1 table visits dans laquelle mes visiteurs stockent des infos :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `visits` (
  `rec_num` int(11) NOT NULL auto_increment,
  `vis_date` bigint(20) default NULL,
  `rank` varchar(4) default NULL,
  `rank_seniority` int(11) default NULL,
  `licence` varchar(4) default NULL,
  `licence_seniority` int(11) default NULL,
  `employer` varchar(4) default NULL,
  ...
  `cvisits` int(11) NOT NULL default '1',
  `member_id` int(11) NOT NULL,
  `action_ref` int(11) default NULL,
  `company_id` int(11) default NULL,
  `employer_id` int(11) default NULL,
  PRIMARY KEY  USING BTREE (`rec_num`,`member_id`)
) ENGINE=MyISAM AUTO_INCREMENT=242 DEFAULT CHARSET=utf8
J'établis des critères de sélection et veux savoir combien de membres correspondent. Jusque là, pas de soucis :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SELECT COUNT(DISTINCT member_id) FROM visits WHERE member_id>0
AND (rank='CDT' OR rank='CEN') AND rank_seniority<5 AND
(licence='MAUN' OR licence='CEUN' OR licence ='CE15')
Maintenant imaginons que je veuille ajouter une ligne dans une deuxième table, pour chacun de ces membres sélectionnés :

Ma table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
CREATE TABLE `selectobject` (
  `rec_num` int(11) NOT NULL auto_increment,
  `select_date` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `member_id` int(11) NOT NULL,
  `object_ref` int(11) NOT NULL,
  `object_type` int(11) NOT NULL,
  `answer_date` datetime default NULL,
  `report_date` datetime default NULL,
  PRIMARY KEY  USING BTREE (`rec_num`,`object_type`,`object_ref`,`member_id`)
) ENGINE=MyISAM AUTO_INCREMENT=311 DEFAULT CHARSET=utf8 COMMENT='link betwn members and polls, adds,joboffers...'
Je connais object_ref, object_type.
select_date est un timestamp.
answer_date et report_date restent null :

J'essaye une première requête qui fonctionne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
INSERT INTO selectobject (object_type, object_ref, member_id) SELECT
$object_type, $object_ref, member_id FROM visits WHERE member_id>0
AND (rank='CDT' OR rank='CEN') AND rank_seniority<5 AND
(licence='MAUN' OR licence='CEUN' OR licence ='CE15')
Par contre, comment ajouter le DISTINCT ? Cette requête ne marche pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
INSERT INTO selectobject (object_type, object_ref, member_id) SELECT
$object_type, $object_ref, DISTINCT member_id FROM visits WHERE
member_id>0 AND (rank='CDT' OR rank='CEN') AND rank_seniority<5
AND (licence='MAUN' OR licence='CEUN' OR licence ='CE15')
Cerise sur le gâteau, chaque membre pouvant saisir plusieurs entrées dans la table visits (par exemple à plusieurs mois d'intervalle), comment ne tenir compte que de la dernière de ces déclarations ?

En comptage, celle-ci semble ok :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SELECT COUNT(DISTINCT member_id) max(vis_date) FROM visits WHERE
member_id>0 AND (rank='CDT' OR rank='CEN') AND rank_seniority<5
AND (licence='MAUN' OR licence='CEUN' OR licence ='CE15')
Mais en INSERT, cela ne marche plus car j'ai une différence de nombre de champs retournés par ma requête SELECT et remplis par ma requête INSERT :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
INSERT INTO selectobject (object_type, object_ref, member_id) SELECT
$object_type, $object_ref, DISTINCT member_id max(vis_date)
FROM visits WHERE member_id>0 AND (rank='CDT' OR rank='CEN')
AND rank_seniority<5 AND (licence='MAUN' OR licence='CEUN' OR
licence ='CE15')
Une idée ?

Merci de votre aide !

Px