Aide requete

VaN
Mammouth du PHP | 1107 Messages

12 mars 2010, 23:31

J'ai 2 tables, une table structures et une table logs :
CREATE TABLE IF NOT EXISTS `structures` (
  `je_id` smallint(6) NOT NULL AUTO_INCREMENT,
  `je_nom` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`je_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=219 ;


CREATE TABLE IF NOT EXISTS `cnje_logs` (
  `log_id` int(11) NOT NULL AUTO_INCREMENT,
  `log_datetime` datetime NOT NULL,
  `log_user_id` int(11) NOT NULL,
  `log_je_id` smallint(6) NOT NULL,
  PRIMARY KEY (`log_id`),
  KEY `log_user_id` (`log_user_id`),
  KEY `log_je_id` (`log_je_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
J'aimerai sélectionner tous les champs je_id de la table structures qui n'apparaissent pas dans le champ log_je_id de la table logs depuis 2 mois.

J'ai essayé avec un NOT IN, mais cela ne fonctionne pas. Un peu d'aide serait la bienvenue.

Eléphanteau du PHP | 13 Messages

13 mars 2010, 12:20

Salut,

Si j'ai bien compris tes tables et leur lien (je_id et log_je_id), je ferai tel quel
SELECT log_je_id
FROM cnje_logs
left JOIN structures ON je_id=log_je_id
AND log_datetime > SUBDATE(CURDATE(),INTERVAL 2 MONTH)
where je_id is Null
Si je_id n'existe pas dans cnje_logs depuis 2 mois, tu ne peux pas les renvoyer... Donc la jointure externe me renvoie tous les je_id n'appartenant pas à cnje_logs depuis 2 mois et par conséquent, je_id est Null.


essaye la et si ce n'est pas ce que tu recherches on fera autrement...

ViPHP
ViPHP | 2291 Messages

13 mars 2010, 12:59

Salut,
Quelque chose comme ca :?:
$Requete="SELECT st.je_id, cl.log_je_id, cl.log_datetime
          FROM structures st,  cnje_logs cl
          WHERE log_datetime > SUBDATE(CURDATE(),INTERVAL 2 MONTH)
          AND st.je_id != cl.log_je_id ";
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

VaN
Mammouth du PHP | 1107 Messages

13 mars 2010, 18:39

Aucune des 2 requêtes ne semble marcher.

La première me renvoie un tableau remplit de 0 :
Array
(
    [0] => Array
        (
            [log_je_id] => 0
        )

    [1] => Array
        (
            [log_je_id] => 0
        )

    [2] => Array
        (
            [log_je_id] => 0
        )

    [3] => Array
        (
            [log_je_id] => 0
        )

    [4] => Array
        (
            [log_je_id] => 0
        )
}
la deuxième me renvoie bien des résultats :
Array
(
    [0] => Array
        (
            [je_id] => 1
            [log_je_id] => 0
            [log_datetime] => 2010-03-13 13:43:19
        )

    [1] => Array
        (
            [je_id] => 1
            [log_je_id] => 0
            [log_datetime] => 2010-03-13 13:46:01
        )

    [2] => Array
        (
            [je_id] => 1
            [log_je_id] => 74
            [log_datetime] => 2010-03-13 13:46:35
        )

    [3] => Array
        (
            [je_id] => 1
            [log_je_id] => 53
            [log_datetime] => 2010-03-13 13:47:25
        )

    [4] => Array
        (
            [je_id] => 1
            [log_je_id] => 0
            [log_datetime] => 2010-03-13 13:47:31
        )

    [5] => Array
        (
            [je_id] => 1
            [log_je_id] => 31
            [log_datetime] => 2010-03-13 13:47:37
        )

    [6] => Array
        (
            [je_id] => 1
            [log_je_id] => 90
            [log_datetime] => 2010-03-13 13:51:20
        )
)
Mais ces log_je_id sont présents dans ma table de logs, et leur log_datetime est compris entre il y'a 2 mois et aujourd'hui. Ce n'est donc pas ce que je recherche. Et je trouve bizarre que pour chaque ligne du tableau, je_id soit différent de log_je_id, alors que c'est ce qui fait le lien entre ma table de logs et ma table de structures.

ViPHP
ViPHP | 2291 Messages

13 mars 2010, 19:11

Et comme ceci :?:
$Requete="SELECT st.je_id, cl.log_je_id, cl.log_datetime
          FROM structures st,  cnje_logs cl
          WHERE cl.log_datetime > SUBDATE(CURDATE(),INTERVAL 2 MONTH)
          AND st.je_id != cl.log_je_id ";
Et je trouve bizarre que pour chaque ligne du tableau, je_id soit différent de log_je_id, alors que c'est ce qui fait le lien entre ma table de logs et ma table de structures.
les champs je_id de la table structures qui n'apparaissent pas dans le champ log_je_id
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

VaN
Mammouth du PHP | 1107 Messages

13 mars 2010, 21:21

Même résultat que la précédente. Les ID que je récupère sont des ID présents dans log_je_id de la table logs.

Est-ce que ça aiderait si je postais un export avec quelques lignes de mes 2 tables ?

ViPHP
ViPHP | 2291 Messages

13 mars 2010, 21:41

Oui
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

VaN
Mammouth du PHP | 1107 Messages

13 mars 2010, 22:09

CREATE TABLE IF NOT EXISTS `structures` (
  `je_id` smallint(6) NOT NULL AUTO_INCREMENT,
  `je_nom` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`je_id`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=223 ;

--
-- Contenu de la table `structures`
--

INSERT INTO `structures` (`je_id`, `je_nom`) VALUES
(1, 'Structure 1'),
(2, 'Structure 2'),
(3, 'Structure 3'),
(4, 'Structure 4'),
(5, 'Structure 5'),
(6, 'Structure 6'),
(7, 'Structure 7'),
(8, 'Structure 8'),
(9, 'Structure 9'),
(10, 'Structure10'),

--
-- Structure de la table `cnje_logs`
--

CREATE TABLE IF NOT EXISTS `cnje_logs` (
  `log_id` int(11) NOT NULL AUTO_INCREMENT,
  `log_datetime` datetime NOT NULL,
  `log_user_id` int(11) NOT NULL,
  `log_je_id` smallint(6) NOT NULL,
  PRIMARY KEY (`log_id`),
  KEY `log_user_id` (`log_user_id`),
  KEY `log_je_id` (`log_je_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=113 ;

--
-- Contenu de la table `cnje_logs`
--

INSERT INTO `cnje_logs` (`log_id`, `log_datetime`, `log_user_id`, `log_je_id`) VALUES
(1, '2010-03-13 12:46:36', 2, 1),
(2, '2010-03-13 13:13:58', 2, 1),
(3, '2010-03-13 13:14:22', 1, 1),
(4, '2010-03-13 13:43:19', 5, 3),
(5, '2010-03-13 13:46:01', 6, 3),
(6, '2010-03-13 13:46:09', 1, 1),
(7, '2010-03-13 13:46:35', 132, 5),
(8, '2010-03-13 13:47:25', 88, 6),
(9, '2010-03-13 13:47:31', 143, 8),
(10, '2010-03-13 13:47:37', 111, 5),
(11, '2010-03-13 13:51:20', 40, 6),
(12, '2010-03-13 13:52:06', 40, 1),
(13, '2010-03-13 13:52:26', 133, 3),
(14, '2010-03-13 13:53:37', 40, 10),
(15, '2010-03-13 13:54:43', 40, 10),
(16, '2010-03-13 13:54:54', 4, 1),
(17, '2010-03-13 13:54:58', 40, 10),
(18, '2010-03-13 13:56:12', 105, 5),
(19, '2010-03-13 13:56:28', 133, 6),
(20, '2010-03-13 13:59:39', 105, 8),
(20, '2010-01-01 13:59:39', 105, 2),
Voilà. Normalement, je devrais récupérer les je_id suivants : 4, 7 et 9, qui sont complétement absents de la table logs.
Ainsi que le je_id 2, qui est présent, mais dont le datetime est supérieur à 2 mois.

ViPHP
ViPHP | 1024 Messages

14 mars 2010, 00:06

Je propose ceci :
SELECT je_id
FROM structures 
LEFT JOIN cnje_logs ON je_id=log_je_id
AND log_datetime > SUBDATE(CURDATE(),INTERVAL 2 MONTH)
WHERE log_je_id IS NULL
 
on sélectionne :
- je_id
- à partir de la table structure
- liée à la table de log par l'id
- sur les logs inférieurs à 2 mois
- sans enregistrement dans les logs (d'où le left join)

A+

Pascal

VaN
Mammouth du PHP | 1107 Messages

14 mars 2010, 02:28

Je propose ceci :
SELECT je_id
FROM structures 
LEFT JOIN cnje_logs ON je_id=log_je_id
AND log_datetime > SUBDATE(CURDATE(),INTERVAL 2 MONTH)
WHERE log_je_id IS NULL
 
on sélectionne :
- je_id
- à partir de la table structure
- liée à la table de log par l'id
- sur les logs inférieurs à 2 mois
- sans enregistrement dans les logs (d'où le left join)

A+

Pascal
Bingo ! Ca à l'air de fonctionner impec !

ViPHP
ViPHP | 5462 Messages

15 mars 2010, 15:50

T'as tout le temps des problèmes ?