Aide selection et classement (JOIN ??) [PDO/SQL] - SQL/NoSQL - Programmation
Marsh Posté le 25-01-2010 à 16:19:46
Hum... alors déjà faire des unions entre des tables qui n'ont pas la même structure c'est risqué, vouloir sélectionner le tout et le classer, c'est le cirque Pinder en tournée.
Essaie déjà de sélectionner les 10 éléments les plus récents de chaque table et on verra ce qu'on peut faire de tout ça !
En supposant que chaque table ait un identifiant nommé id, on pourrait partir sur quelque chose comme ça :
/!\ Warning usine à gaz /!\
Select tbl, id, date_ajout
from
(
Select 'table1' as tbl, id, date_ajout
from table1
where valid = 1
UNION
Select 'table2' as tbl, id, date_ajout
from table2
where valid = 1
UNION
Select 'table3' as tbl, id, date_ajout
from table3
where valid = 1
) as ENSEMBLE_TABLES
order by date_ajout
limit 0, 10
Cette requête te donne les 10 derniers éléments les plus récents avec le nom de la table et l'id, il faut ensuite réutiliser le résultat de ce sql avec chaque table pour n'en extraire que ce dont tu as besoin.
Marsh Posté le 25-01-2010 à 16:48:22
Salut,
Merci pour cette indication, je test et je tiens au courant.
PS: juste, ca serait pas Select tbl, id, date_ajout as 'table1' from table1 ?? c'est la première fois (débutant inside) que je le vois écrit comme tu l'as mis.
Aussi est-ce que ça voudrait dire qu'il faut que je nomme individuellement chacune des colonnes que je souhaite récupérer ? Le truc c'est que je souhaite
utiliser les infos différentes de chacune des tables. Le seul élément de comparaison étant la date.
Marsh Posté le 25-01-2010 à 16:56:50
Alors, ici on le fait en 2 passes.
le select 'table1' as tbl, c'est histoire de pouvoir récupérer dans le résultat le nom de la table (je définis une constante) et l'identifiant qui va bien.
imaginons que tu stockes le résultat de cette première requête dans une table "resultat".
il te reste à faire :
Select *
from table1
where id in
(select id
from resultat
where tbl = 'table1')
Pour récupérer toutes les lignes de la table1 qui font parties des 10 plus récentes (il est possible que ce query ne ramène rien).
Ensuite tu fais la même chose pour toutes tes tables en changeant la clause where tbl = 'tablexxx' et tu auras le résultat pour chaque table.
Marsh Posté le 25-01-2010 à 17:25:35
Tu m'as perdu sur ce coup ^^.
Le truc c'est qu'il n'y a pas de relation entre les id des tables (ni entre aucun élément).
Je vais développer (c'est un exemple, dans mon cas il y a plus de tables). On vend des voitures et du poisson
Table 1: Voitures
colonnes: id, Prix, Annee, Kilometrage, date_ajout(sur le site), valid, photo, etc.
Table 2: Poisson
colonnes: id, espece, poids, provenance, date_ajout(sur le site), valid, photo, etc.
Je souhaite afficher par date les éléments par date d'ajout (si valid=1) sachant que la date n'est pas affichée,
ce qui sera affiché sera la photo suivie, si c'est une voiture de sont prix, de son année et de son kilométrage,
et si c'est un poisson, de son espèce, de sa provenance, etc.
Je suis en train de me dire qu'il faudrait peut-etre creer une table de relation contenant tous les ajouts
avec une colonne relative à la table dans laquelle est stocké l'élément et son id. Inutile ?
Marsh Posté le 25-01-2010 à 17:31:29
En gros ce que j'essaie de faire, c'est un espèce de table de log qui me donne pour chaque table (tbl) quelle est le dernier élément ajouté (date_ajout) et quel est son identifiant (id).
Ensuite à partir de cette table de log, je prends le 10 premiers et je vais chercher les éléments dont j'ai besoin dans chaque table "source" respective.
P.S. : le SQL c'est comme dans la vraie vie, on ne mélange pas les poissons et les voitures
Marsh Posté le 25-01-2010 à 17:38:36
Ah yes, j'ai capté, bonne idée!
Dans tous les cas (ajout de table relationnelle ou ta méthode), il faudra forcément finir
par faire des select séparés pour chacun des éléments par table auxquelles ils
appartiennent, nan? (du fait des structures différentes).
Je vais essayer comme tu dis, ça coute moins chère .
Marsh Posté le 25-01-2010 à 17:40:21
durk a écrit : Ah yes, j'ai capté, bonne idée! |
Ca me semblait évident, mais il faut croire que non
Marsh Posté le 25-01-2010 à 17:49:04
Yep .
C'est que l'évidence est proportionnelle au degré de savoir.
Je test et je tiens au courant.
Marsh Posté le 25-01-2010 à 18:07:02
Je garantis pas la syntaxe, mais en gros le principe est là !
bon courage
Marsh Posté le 25-01-2010 à 18:10:11
C'est bon, je récupère bien les id et le nom de la table.
Tu m'as été d'une grande aide!
Question subsidiaire, niveau optimisation, sur de grandes tables (bcoups d'éléments) ca rame pas trop
ce genre de requêtes (chercher tous les éléments dans chacune des tables puis trier), ou c'est préférable
de faire une table de relation comme j'avais pensé et qui contiendrait les dates d'ajouts des elements, leurs id
et la table à laquelle ils appartient (en gros le résultat de la master UNION requête), de l'interroger puis
de chercher dans chacune des autres tables uniquement les éléments qui m'intéressent?
Qu'en penses-tu? (toi ou qqn d'autre)
edit: la syntaxe est bonne
Marsh Posté le 25-01-2010 à 20:13:21
Ca dépend, à priori si les indexes des tables sont bons et comme tu interroge que par Id, ça devrait pas trop ramer.
Sinon oui, une table de stockage intermédiaire est une solution envisageable !
Marsh Posté le 25-01-2010 à 16:14:38
Bonjour à tous
J'ai une bdd (MySQL sous PDO) qui contient plusieurs tables avec des colonnes différentes les unes des autres sauf la date d'ajout d'un élément et la colonne valid qui st communes.
Je souhaite sélectionner parmi l'ensemble les tables les dix éléments les plus récents.
Étant donné que je débute Voila ou j'en suis, sans résultat (print_r donne un tableau tableau vide):
Je précise que j'ai bien "bindé" les valeurs pour le LIMIT et que j'ai essayé une bonne partie des JOIN (et sans biensur), sans succès .
Merci par avance.