Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/05/2011, 18h24   #1
Invité de passage
 
Inscription : mai 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 5
Points : 0
Points : 0
Par défaut requete uniquement de jointures externes

Bonjour,

Je fais face à un problème que je n'arrive pas à résoudre, et je suis sur qu'une ptite astuce toute simple existe !
J'ai pas mal de table à joindre en fonction de leur champs date.
Le truc c'est que ces tables n'ont pas forcément été alimenté le jour voulue pour X raison, c'est pourquoi j'utilise des jointures externes.
Mais voila, il y a bien un "from" et un "where" dans ma requète.
Or si c'est justement la table du from/where qui n'a pas été alimenté, hé bien la requête ne renvoie rien : logique !

Comment peut-on pallier à ce soucis ? J'avais idée d'utiliser la table "dual" mais sans résultat...

Quelqu'un à une solution ?

N'hésiter pas à me demander des explications si je suis trop obscure.

Merci @ tous
meric92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 21h50   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
salut,

pourquoi tu ne fais pas un truc simple:

une table de référence que tu mets à jour à chaque acces à une de tes tables et dont tu te sers dans le from pour faire les jointures sur les autres tables...

ref
id int(4)
stamp datetime

Code sql :
1
2
3
4
5
6
SELECT ....
FROM ref
LEFT JOIN ...
...
LEFT JOIN ...
WHERE stamp="2011"
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 10h01   #3
Invité de passage
 
Inscription : mai 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 5
Points : 0
Points : 0
Merci pour ton aide Eric,

J'avais déjà penser faire quelque chose de la sorte mais si je peux éviter de rajouter une table ...
Le "à chaque acces à une de tes tables" est assez lourd à mettre en place en fait ... ya pas mal de job différent qui l'alimente !
Il me faut juste une table fastice pour faire un truc du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT
     table1.champ1,
     table2.champ1,
     ...
FROM
     dual
LEFT OUTER JOIN table1 ON table1.DATE = date_voulue
LEFT OUTER JOIN table2 ON table2.DATE = date_voulue
...
WHERE
     toujours_vrai
C'est peut-être plus clair comme ca
meric92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 10h19   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
salut,

oui tu peux aussi faire comme ça, mais tu auras des pb si tu as une date où il n'y a des résultats dans aucune des tables jointes
mais l'avantage de la table réelle c'est que tu ne retournes des résultats que pour une date valide
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 11h09   #5
Invité de passage
 
Inscription : mai 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 5
Points : 0
Points : 0
Au pire ca ne retourne rien non ?
Le problème avec ma solution, c'est que mysql n'a pas l'air d'aimer le :
Code :
1
2
FROM dual
LEFT OUTER JOIN
Ce n'est pas correct ?
meric92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 11h53   #6
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
c'est pas ça... ça marche

je te dit juste que tu aurais plus de cohérence à jointer sur une date ce qui te permettrait de t'assurer que les jointure ont une raison d'être puisque la date existe...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 12h03   #7
Invité de passage
 
Inscription : mai 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 5
Points : 0
Points : 0
Héhé ouioui j'ai bien compris la raison de ta solution, et j'avoue que c'est la plus propre. Mais dans mon cas présent elle n'est vraiment pas facilement implémentable ...

Sinon justement, ma solution ne marche pas avec "dual" ...
Je viens de tester avec une table qui existe vraiment dans ma BDD et ca fonctionne... c'est juste trop laid parce que je dois mettre un alias dans le FROM pour pouvoir récupérer tout de même les données de mon "faux" FROM ...
meric92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 12h31   #8
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
et oui
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 14h43   #9
Invité de passage
 
Inscription : mai 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 5
Points : 0
Points : 0
Du coup je ne comprend pas pourquoi ca ne marche pas avec la table dual, ce n'est pas justement son but normalement ?
meric92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 15h02   #10
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
je sais pas ce qu'elle contient...

moi je serais de toi j'emploierai ma solution, plus propre et tu es sur que ça marche

au pire fait des procédures stockées, si tu peux, pour encadrer tes différents appels et booster un peu les perfs
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h44   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 005
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 005
Points : 18 275
Points : 18 275
Envoyer un message via MSN à CinePhil
Si tu ne veux pas créer de table de calendrier contenant toutes les dates, tu peux créer une table temporaire contenant toutes les dates existantes dans toutes tes tables puis faire tes jointures externes à partir de cette table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TEMPORARY TABLE toutes_dates
SELECT la_colonne_date AS la_date
FROM table1
UNION
SELECT l_autre_colonne_date
FROM table2
-- autant d'unions que de tables à traiter
;
 
SELECT t1.col1, 
    t2.col2
    -- et toutes les colonnes (et pas champ !) que tu veux
FROM toutes_dates d
LEFT OUTER JOIN table1 t1 ON t1.la_colonne_date = d.la_date
LEFT OUTER JOIN table2 t2 ON t2.l_autre_colonne_date = d.la_date
-- autant de jointures que de tables
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h49.


 
 
 
 
Partenaires

Hébergement Web