Tri sur tableau multi pour génération de jointures SQL
Bonjour,
voilà je bloque sur le problème suivant qui me semble assez complexe. Le but est de générer automatiquement une condition SQL valide de type "FROM xxxx INNER JOIN xxxx ON xxxx.xx = xxxxx.xx", etc à partir de différentes définitions de clés étrangères et de leurs clés primaires associées.
Pour l'exemple je stocke les liaisons de tables (clés primaires / clés étrangères) dans un tableau, mettons que j'aie les 3 clés étrangères suivantes :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| foreignKeys[0]['name'] = 'id_user';
foreignKeys[0]['table'] = 'own';
foreignKeys[0]['primaryKeyName'] = 'id';
foreignKeys[0]['primaryKeyTableName'] = 'users';
foreignKeys[1]['name'] = 'id_user';
foreignKeys[1]['table'] = 'cards';
foreignKeys[1]['primaryKeyName'] = 'id';
foreignKeys[1]['primaryKeyTableName'] = 'users';
foreignKeys[2]['name'] = 'id_appt';
foreignKeys[2]['table'] = 'own';
foreignKeys[2]['primaryKeyName'] = 'id';
foreignKeys[2]['primaryKeyTableName'] = 'appts'; |
Pour ces tables SQL :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| USERS
id
OWN
#id_user
#id_appt
APPTS
id
CARDS
id
#id_user |
Je voudrais pouvoir aboutir à une requête du type :
Code:
1 2 3 4
| FROM users
INNER JOIN own ON own.id_user = users.id
INNER JOIN appts ON appts.id = own.id_appt
INNER JOIN cards ON cards.id_user = users.id |
Mais il a y 2 problèmes qui se posent dûs à la syntaxe SQL :
1) un nom de table ne peut apparaître qu'une seule fois dans la requête, ceci ne fonctionne pas :
INNER JOIN own ON own.id_user = users.id
INNER JOIN own ON appts.id = own.id_appt
2) on ne peut utiliser une clé que si sa table a déjà été nommée, ex, ceci ne fonctionne pas :
FROM appts
INNER JOIN cards ON cards.id_user = users.id
INNER JOIN own ON own.id_appt = appts.id
INNER JOIN users ON own.id_user = users.id
Les index numériques du tableau foreignKeys sont censés ne pas avoir d'importance. Je suis parti dans l'idée de trier le tableau multi pour ensuite n'avoir plus qu'à le parcourir en construisant la chaîne (sans tests) mais je ne crois pas que cela soit possible sans tests.
Voilà, je ne suis pas sûr que le tableau soit la bonne structure de données pour stocker les liaisons. Si quelqu'un a une idée quelconque, je lui en serais reconnaissant :D
Merci d'avance.