Sujet: [SQL] probleme de jointure
20/12/2007 @ 19:11:43: cauet: [SQL] probleme de jointure
Hello,

J'ai un petit soucis dans ma jointure:

  1. SELECT DISTINCT e. * , c.status, c.msgid, DATE_FORMAT(e.date'%d/%m/%Y % H:% i:%s') AS date_send FROM envoi_push e LEFT OUTER JOIN confirm_push c ON c.msgid = e.status WHERE type = 'BE' ORDER by date DESC LIMIT 0,40


Bon alors le soucis, c'est que je lui demande de m'inclure la colonne Status dans mon résultat. Tout simplement.

Le problème, c'est que j'ai plusieurs Status qui répondent. Il faut que je sélectionne celui avec le plus grand id. (le dernier quoi)

J'ai testé :
  1. AND c.id = max(c.id)


(merci ovh) Mais ca ne fonctionne pas : #1111 - Invalid use of group function

Quelqu'un pourrait me guider ?
20/12/2007 @ 19:24:20: cauet: [SQL] probleme de jointure
Tiens le tomic fonctionne :grin:
20/12/2007 @ 19:45:05: Keeper: [SQL] probleme de jointure
le where max ne fonctionne pas

par contre en gros tu fais une jointure de plus avec un SELECT max(id),status .....

comme ça ta requête va se faire et sélectionner que les lignes qui auront l'ID max et le status bidule, ce qui en théorie n'est vrai que pour une seule occurence.
20/12/2007 @ 19:49:45: kortenberg: [SQL] probleme de jointure
Quel programme serveur sql?
20/12/2007 @ 19:51:20: cauet: [SQL] probleme de jointure
kortenberg> MySQL
20/12/2007 @ 20:44:24: ovh: [SQL] probleme de jointure
Essaie une fois avec une clause HAVING.
20/12/2007 @ 21:04:44: cauet: [SQL] probleme de jointure
pffffff..surement po.


SELECT DISTINCT e. * , c.status, c.msgid, DATE_FORMAT( e.date, '%d/%m/%Y %H:%i:%s' ) AS date_send
FROM envoi_push e
LEFT OUTER JOIN confirm_push c ON c.msgid = e.status
WHERE type = 'BE'
HAVING max( c.id )
ORDER BY date DESC
LIMIT 0 , 40



il ne me renvoie plus qu'1 seul enregistrement..
20/12/2007 @ 21:37:24: ovh: [SQL] probleme de jointure
il ne me renvoie plus qu'1 seul enregistrement..

Ben... c'était pas ça le but ? :figti:
20/12/2007 @ 21:39:19: cauet: [SQL] probleme de jointure
ben là, non!
je lui demande de tout prendre...
le limit 0,40 est pas là pour décorer :grin:
20/12/2007 @ 21:45:02: cauet: [SQL] probleme de jointure
enfin, je crois que t'a rien compris au bidule ové.

Tantôt, il prenait TROP d'enregistrement car je lui demandais de me prendre les STATUS de la table JOINTE. Mais il y en avait trop. (des STATUS) Il faut donc prendre le + récent.

Et ici, ça à l'air correct. Il ne prend plus que le dernier STATUS,(enfin j'espère) mais la requête en elle même ne prend plus que le premier record de la table..

Alors qu'il y à techniquement 150 000 records qui répondent à la clause WHERE type='BE' ..
20/12/2007 @ 21:51:20: cauet: [SQL] probleme de jointure
Bon et si ca peut te rassurer.. le max(c.id) déconne car il me renvoie pas du tout le plus grand id :kiki:
20/12/2007 @ 22:29:50: cauet: [SQL] probleme de jointure

SELECT content, confirm_push.status
FROM envoi_push, confirm_push
WHERE envoi_push.status = confirm_push.msgid
AND confirm_push.msgid = envoi_push.status
LIMIT 0 , 10;


j'ai tenté l'approche autrement..
ca fonctionne mais,

- Il me renvoie une ligne de envoi_push, par confirm_push trouvé.. (donc doublons) et DISTINCT n'agis pas. il faut juste prendre le DERNIER.

- Et quand ce 1er problème sera reglé, il faudra juste renvoyer le plus grand id trouvé dans confirm_push ...
20/12/2007 @ 22:36:31: ovh: [SQL] probleme de jointure
OK j'ai pigé ce que tu veux. Par contre en une seule requête je ne vois pas de solution comme ça à chaud, mais je suis pas un pro du SQL non plus :cupra:
20/12/2007 @ 22:38:18: cauet: [SQL] probleme de jointure
Arf.. me dit pas que c'est impossible .. J'y crois pas!
(Ou alors SQL c'est vraiment de la merde..)

Je fais ça actuellement en plusieurs requêtes, mais c'est péniblement long et douloureux pour le serveur quand tu effectue donc 1 + (40*1) requêtes !
21/12/2007 @ 08:46:40: Keeper: [SQL] probleme de jointure
cauet > poste la définition de tes tables et décrit ce que tu veux exactement, je suis sur que j'ai déjà eu le cas récement.
21/12/2007 @ 09:26:23: kortenberg: [SQL] probleme de jointure
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?
  1. SELECT 
  2. `dossier`.*, 
  3. `factureclient`.`DateFacture` 
  4. FROM 
  5. `dossier` 
  6. JOIN  
  7. SELECT *  
  8. FROM `factureclient`  
  9. WHERE `factureclient`.FactureId IN ( 
  10. SELECT Max(FactureId) 
  11. FROM `factureclient` 
  12. GROUP BY `factureclient`.`DossierId` 
  13. ) AS `factureclient` 
  14. 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.
21/12/2007 @ 11:50:53: ovh: [SQL] probleme de jointure
kort'> mysql sait faire des sous-requêtes ? :figti:
21/12/2007 @ 12:14:48: kortenberg: [SQL] probleme de jointure
depuis la version 4.1
21/12/2007 @ 12:57:21: cauet: [SQL] probleme de jointure
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?
  1. SELECT 
  2. `dossier`.*, 
  3. `factureclient`.`DateFacture` 
  4. FROM 
  5. `dossier` 
  6. JOIN  
  7. SELECT *  
  8. FROM `factureclient`  
  9. WHERE `factureclient`.FactureId IN ( 
  10. SELECT Max(FactureId) 
  11. FROM `factureclient` 
  12. GROUP BY `factureclient`.`DossierId` 
  13. ) AS `factureclient` 
  14. 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:
21/12/2007 @ 13:07:05: Keeper: [SQL] probleme de jointure
:angry:

c'est un peu ce que j'ai proposé au début .....
Retour