Programmation » [SQL] probleme de jointure
Catégorie:  
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 19:11:43,
Par cauet
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 ?
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 19:24:20,
Par cauet
Tiens le tomic fonctionne :grin:
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 19:45:05,
Par Keeper
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.
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 19:49:45,
Par kortenberg
Quel programme serveur sql?
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 19:51:20,
Par cauet
kortenberg> MySQL
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 20:44:24,
Par ovh
Essaie une fois avec une clause HAVING.
Je n'ai rien à voir avec www.ovh.com
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 21:04:44,
Par cauet
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..

Dernière édition: 20/12/2007 @ 21:05:06
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 21:37:24,
Par ovh
il ne me renvoie plus qu'1 seul enregistrement..

Ben... c'était pas ça le but ? :figti:
Je n'ai rien à voir avec www.ovh.com
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 21:39:19,
Par cauet
ben là, non!
je lui demande de tout prendre...
le limit 0,40 est pas là pour décorer :grin:

Dernière édition: 20/12/2007 @ 21:39:50
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 21:45:02,
Par cauet
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' ..
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 21:51:20,
Par cauet
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:
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 22:29:50,
Par cauet

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 ...
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 22:36:31,
Par ovh
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:
Je n'ai rien à voir avec www.ovh.com
   
[SQL] probleme de jointure
Publié le 20/12/2007 @ 22:38:18,
Par cauet
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 !
   
[SQL] probleme de jointure
Publié le 21/12/2007 @ 08:46:40,
Par Keeper
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.
   
[SQL] probleme de jointure
Publié le 21/12/2007 @ 09:26:23,
Par kortenberg
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.

Dernière édition: 21/12/2007 @ 12:17:26
   
[SQL] probleme de jointure
Publié le 21/12/2007 @ 11:50:53,
Par ovh
kort'> mysql sait faire des sous-requêtes ? :figti:
Je n'ai rien à voir avec www.ovh.com
   
[SQL] probleme de jointure
Publié le 21/12/2007 @ 12:14:48,
Par kortenberg
depuis la version 4.1

Dernière édition: 21/12/2007 @ 12:16:40
   
[SQL] probleme de jointure
Publié le 21/12/2007 @ 12:57:21,
Par 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?
  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:
   
[SQL] probleme de jointure
Publié le 21/12/2007 @ 13:07:05,
Par Keeper
:angry:

c'est un peu ce que j'ai proposé au début .....
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?