Poster une réponse à un sujet: [SQL] probleme de jointure
Attention, ce sujet est un sujet ancien (6053 jours sans réponse)
blietaer
Mmh quand je fais des selects sur deux tables en one-shot, je prefere toujours des LEFT JOIN plutot que les nested-select de beauf, sauf si les tables ne sont pas 1-to-1 keyable...mais là on parlera de malchance ou de mal-design...
En plus dans ton cas les msgid et status on l'air de bien flirter ensemble, non?
sur le flex, ca devrait groover.
Mais vraiment change de pseudo, la qualité des cauetidienne te hape au passage vers l'abime de la médiocrité télévisuelle et dans la tristesse du trou-noir intergalactique créatif dont elles font preuve sans que, à priori, tu n'y sois pour quoi que ce soit.
En plus dans ton cas les msgid et status on l'air de bien flirter ensemble, non?
sur le flex, ca devrait groover.
Mais vraiment change de pseudo, la qualité des cauetidienne te hape au passage vers l'abime de la médiocrité télévisuelle et dans la tristesse du trou-noir intergalactique créatif dont elles font preuve sans que, à priori, tu n'y sois pour quoi que ce soit.
cauet
Voila la requête "au propre"
Sur serveur de Test avec 1 enregistrement, elle fonctionne.
Par contre en Prod avec des milliers de records, ca foire total.
La requête n'en finit pas, je laisse tourner plus de 3 minutes sans réponse, avant de killer.
Une idée ?
- SELECT
- `envoi_push`.`content`,
- `confirm_push`.`status`
- FROM
- `envoi_push`
- JOIN
- ( SELECT `status`, `msgid`
- FROM `confirm_push`
- WHERE `confirm_push`.`id` IN (
- SELECT Max(`id`)
- FROM `confirm_push`
- GROUP BY `confirm_push`.`msgid`
- )
- ) AS `confirm_push`
- ON `envoi_push`.`status` = `confirm_push`.`msgid`
- ORDER by `confirm_push`.`status` ASC
- LIMIT 10;
Sur serveur de Test avec 1 enregistrement, elle fonctionne.
Par contre en Prod avec des milliers de records, ca foire total.
La requête n'en finit pas, je laisse tourner plus de 3 minutes sans réponse, avant de killer.
Une idée ?
Keeper
chaine vide <> valeur nulle
Clandestino
Pourquoi tu forces l'envoi de valeurs nulles dans des champs qui ne peuvent pas l'être ? (udh et error) ?
cauet
- SELECT
- `envoi_push`.`content`,
- `confirm_push`.`status`
- FROM
- `envoi_push`
- JOIN
- ( SELECT *
- FROM `confirm_push`
- WHERE `confirm_push`.id IN (
- SELECT Max(id)
- FROM `confirm_push`
- GROUP BY `confirm_push`.`msgid`
- )
- ) AS `confirm_push`
- ON `envoi_push`.`status` = `confirm_push`.`msgid` LIMIT 10;
Ca j'avais encore jamais vu
![:smile: :smile:](images/smileys/smile.gif)
![:grin: :grin:](images/smileys/grin.gif)
Structure de la table:
- CREATE TABLE IF NOT EXISTS `envoi_push` (
- `id` int(11) NOT NULL auto_increment,
- `nichandle` varchar(50) NOT NULL,
- `number` varchar(15) NOT NULL,
- `content` varchar(160) NOT NULL,
- `sendertype` varchar(10) NOT NULL,
- `senderid` varchar(15) NOT NULL,
- `typecontent` varchar(10) NOT NULL,
- `udh` varchar(500) NOT NULL,
- `status` int(10) NOT NULL,
- `error` varchar(10) NOT NULL,
- `date` datetime NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=130605 ;
- --
- -- Contenu de la table `envoi_push`
- --
- INSERT INTO `envoi_push` (`id`, `nichandle`, `number`, `content`, `sendertype`, `senderid`, `typecontent`, `udh`, `status`, `error`, `date`) VALUES
- (130602, 'mickael', '32472892611', 'hi', 'number', '3235559657', 'text', '', 3421301, '', '2007-12-21 07:45:09');
- CREATE TABLE IF NOT EXISTS `confirm_push` (
- `id` int(11) NOT NULL auto_increment,
- `msgid` int(11) NOT NULL,
- `status` varchar(35) NOT NULL,
- `date` datetime NOT NULL,
- KEY `msgid` (`msgid`),
- KEY `id` (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=235057 ;
- --
- -- Contenu de la table `confirm_push`
- --
- INSERT INTO `confirm_push` (`id`, `msgid`, `status`, `date`) VALUES
- (235051, 3421301, 'operator', '2007-12-21 07:45:28'),
- (235052, 3421301, 'handset', '2007-12-21 07:45:33');
kortenberg
C'est un peu pour cela que j'ai écrit
Comme l'a proposé keeper, au début, on peut le faire avec un deuxième join ...
Keeper
![:angry: :angry:](images/smileys/angry.gif)
c'est un peu ce que j'ai proposé au début .....
cauet
J'ai testé sur des tables bidons que j'ai en stock.
Ca me donne, pour chaque dossier la date de la dernière facture.
C'est bien ce genre de chose que tu veux?
Comme l'a proposé keeper, au début, on peut le faire avec un deuxième join mais j'ai pas confiance dans l'ordre de leur execution.
Ca me donne, pour chaque dossier la date de la dernière facture.
C'est bien ce genre de chose que tu veux?
- SELECT
- `dossier`.*,
- `factureclient`.`DateFacture`
- FROM
- `dossier`
- JOIN
- ( SELECT *
- FROM `factureclient`
- WHERE `factureclient`.FactureId IN (
- SELECT Max(FactureId)
- FROM `factureclient`
- GROUP BY `factureclient`.`DossierId`
- )
- ) AS `factureclient`
- ON `dossier`.`DossierId` = `factureclient`.`DossierId`
Comme l'a proposé keeper, au début, on peut le faire avec un deuxième join mais j'ai pas confiance dans l'ordre de leur execution.
la sous requpete voilà ce qu'il me faut !
Merci kortenberg, je vais essayer !!
![:smile: :smile:](images/smileys/smile.gif)
kortenberg
depuis la version 4.1
ovh
kort'> mysql sait faire des sous-requêtes ?
![:figti: :figti:](images/smileys/figti.gif)