[PDO/SQL] Aide selection et classement (JOIN ??)

Aide selection et classement (JOIN ??) [PDO/SQL] - SQL/NoSQL - Programmation

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):
 
 

Code :
  1. prepare("SELECT * FROM table1 UNION JOIN table2 UNION JOIN table3 UNION JOIN table4 WHERE table1.valid=1 AND table2.valid=1 AND table3.valid=1 AND table4.valid=1 ORDER BY table1.date_add, table2.date_add, table3.date_add, table4.date_add DESC LIMIT ?, ? " );


 
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.

Reply

Marsh Posté le 25-01-2010 à 16:14:38   

Reply

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.


Message édité par E-Nyar le 25-01-2010 à 16:31:36

---------------
Don't fuck me, I'm anonymous.
Reply

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.


Message édité par durk le 25-01-2010 à 16:50:36
Reply

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.


Message édité par E-Nyar le 25-01-2010 à 16:57:15

---------------
Don't fuck me, I'm anonymous.
Reply

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 ?


Message édité par durk le 25-01-2010 à 17:26:45
Reply

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 :o


Message édité par E-Nyar le 25-01-2010 à 17:37:15

---------------
Don't fuck me, I'm anonymous.
Reply

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  :whistle:.

Reply

Marsh Posté le 25-01-2010 à 17:40:21    

durk a écrit :

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  :whistle:.


 
[:shimay:1]
 
Ca me semblait évident, mais il faut croire que non  :p  
 


---------------
Don't fuck me, I'm anonymous.
Reply

Marsh Posté le 25-01-2010 à 17:49:04    

Yep   :whistle: .
C'est que l'évidence est proportionnelle au degré de savoir. ;)  
 
Je test et je tiens au courant.

Reply

Marsh Posté le 25-01-2010 à 18:07:02    

Je garantis pas la syntaxe, mais en gros le principe est là !
 
bon courage :)


---------------
Don't fuck me, I'm anonymous.
Reply

Marsh Posté le 25-01-2010 à 18:07:02   

Reply

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


Message édité par durk le 25-01-2010 à 18:42:28
Reply

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 !


---------------
Don't fuck me, I'm anonymous.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed