[RESOLU] CONCAT dans le ON d'un LEFT JOIN

Avatar du membre
Eléphant du PHP | 224 Messages

13 déc. 2014, 00:26

Hello,

Encore une question tordue :D

J'ai une table events avec une colonne dock et une colone place.
Dans la colone dock, j'ai un numéro , dans la colone place j'ai soit 0 soit A soit B.

J'ai une table places dans laquel j'ai une colonne place_name qui a les nom de places par exemple 307A .

Je voudrais faire une jointure pour laquelle la place_name de palces = la concataination de dock et place de events.

J'ai fais ce code là :
SELECT concat(events.dock, events.place) AS pl_name, places.place_name
FROM events 
LEFT JOIN places
ON events.pl_name = places.place_name
WHERE events.place = 'A'
Mais évidement, celan e marche pas , il m'est retourné que la colone events.pl_name n'existe pas .

J'ai essayé en faisant :
ON events.concat(events.dock, events.place)  = places.place_name
mais il m'insulte encore plus :(

Est-il possible de réustiliser dans le ON, un alias quel'on a créé dans le select ? Si non , comment je pourrias faire cela ?

M'ciiii :)
Couin
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

ViPHP
ViPHP | 928 Messages

13 déc. 2014, 00:47

Essaie
SELECT concat(events.dock, events.place) AS pl_name, places.place_name
FROM events
LEFT JOIN places
WHERE pl_name = places.place_name
   AND events.place = 'A'

Avatar du membre
Eléphant du PHP | 224 Messages

13 déc. 2014, 01:03

Hello,
merci pour ta réponbse mais en testant ce code, je pense qu'il n'est pas content car il manque la condition ON pour faire la jointure.
J'ai totuefois essayé aussi :
SELECT concat(events.dock, events.place) AS pl_name, places.place_name
FROM events
LEFT JOIN places
ON pl_name = places.place_name
WHERE events.place = 'A'
mais sans succès :(

Edit :

J'arriver à sortir quelque chose avec ce code
SELECT concat(events.dock, events.place) AS pl_name, places.place_name, places.place_status
FROM events
LEFT JOIN places
ON (concat(events.dock, events.place) ) = places.place_name
WHERE events.place = 'A'
mais pour le WHERE events.place ='0' , je vias devoir adapter car le résultat ne correspond pas à mes attentes.
Je reviens donner des nouvelles sur mon avancement :)
Modifié en dernier par moogli le 13 déc. 2014, 17:25, modifié 1 fois.
Raison : bbcode sql
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 déc. 2014, 17:26

salut,

tu te rend compte que
- une jointure se fait entre deux clefs de tables (pk et fk avec une une ou plusieurs colonnes)
- ce que tu indique ne ressemble pas un modèle normalisé.

si tu doit avoir une telle relation n'utilise pas join et règle cela dans le prédicat (clause where) quitte a prendre en compte que cela peux ne pas exister.

perso j'opterais plus pour la normalisation de la base afin d'avoir quelque chose de plus simple (et moins source d'emmerde).

donc soit une FK dans events, soit place devrait avoir deux colonnes dock et name ;)


@+
Il en faut peu pour être heureux ......

Avatar du membre
Eléphant du PHP | 224 Messages

20 déc. 2014, 16:45

Hello,

Désolé pour le délai de retour.

Merci pour vos réponses, mais j'ai modifié mes bases (pour d'autres raisons de fonctionnalités que j'ia dû mettre) et donc j'ai revoir mes méthodes et fais une colonne en plus , qui s'appelle place_master, et qui me sert de clé pour faire une jointure de la table place à elle même en me servant de cette colonne. La concaténation n'est ddonc plus nécéssaire.

Par exemple, pour la place 25B, sa place_master est 25A, et j'ai donc pu faire la jointure.

Bon ouiK :)
Couin
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen: