Page 1 sur 1

Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 11:46
par AoSiX
Hello, mon titre me fait peur, mais mais parlons technique ce sera plus facile ^^

J'ai deux tables :

Code : Tout sélectionner

A ----------------- A_ID | Date

Code : Tout sélectionner

B ----------------- B_ID | Date
Il y a d'autres champs, certains commun, mais qui ne rentre pas en compte dans ma sélection.

J'aimerai faire un SELECT sur ces deux tables en même temps pour obtenir les 5 dernières entrées trier par date.

Schématisons

Code : Tout sélectionner

A ----------------- A_ID | Date ----------------- 1 - 1 ----------------- 2 - 4 ----------------- 3 - 5 -----------------

Code : Tout sélectionner

B ----------------- B_ID | Date ----------------- 1 - 2 ----------------- 2 - 3 ----------------- 3 - 6 -----------------
Je voudrait obtenir avec ma requêtes ( en order by Date ASC ) A1, B1, B2, A2, A3..

Quelle est la bonne solution ? Je me pencherai sur une jointure mais je suis dans le flou.

EDIT : Mon SGBD est MySQL

Re: Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 12:28
par Ganesh
Bonjour,

J'opterais plus pour un UNION de façon à regrouper les deux tables puis à faire le tri sur le champ commun.

Re: Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 12:33
par AoSiX
Salut,

j'ai effectivement tenté quelquechose comme cela :
(SELECT Client_Like_ID as CLID, Date FROM Client_Like ORDER BY Date LIMIT 10)
UNION
(SELECT Client_Reco_ID as CRID, Date FROM Client_Reco ORDER BY Date LIMIT 10)
ORDER BY Date
Avec des résultats satisfaisant, cependant je n'ai que la colonne CLID et Date, pas de CRID dans le cas ou il existe, donc je perd la possibilité d'en faire quoi que ce soit.

Re: Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 12:39
par Ganesh
Ton champ est nommé CLID mais il contient les CRID avec leurs dates respectives. Tout va dépendre de l'utilisation que tu veux faire du résultat de ta requête.
Sinon, tu peux simplifier ta requête :
SELECT Client_Like_ID, Date FROM Client_Like
  UNION
SELECT Client_Reco_ID, Date FROM Client_Reco
ORDER BY Date DESC LIMIT 0,5
Attention aussi à tes champs nommés par des mots réservés SQL, cela peut te conduire à quelques surprises... Je te conseille de changer cela.

Re: Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 12:42
par AoSiX
Solution super sale, mais qui marche trouvée :
(SELECT Client_Like_ID as ID, Date, 1 FROM Client_Like ORDER BY Date LIMIT 10)
UNION ALL
(SELECT Client_Reco_ID, Date, 2 FROM Client_Reco ORDER BY Date LIMIT 10)
ORDER BY Date
Si 2-> Reco ; si 1 -> like

Si il y a mieux dite le moi :p

Re: Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 12:59
par Ganesh
Le but est d'avoir les 10 dernières entrées de chaque table ou les 5 dernières des deux tables confondues comme tu le demandais dans ton premier message ?
Si c'est la deuxième proposition et que tu souhaites conserver une trace de la table d'origine, ceci est probablement une solution intéressante :
SELECT id, Date, type FROM (
  SELECT Client_Like_ID AS id, Date, 'like' AS type FROM Client_Like
    UNION ALL
  SELECT Client_Reco_ID, Date, 'reco' FROM Client_Like
)
ORDER BY Date DESC LIMIT 0,5

Re: Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 13:18
par AoSiX
Le but est d'avoir ... les 5 dernières des deux tables confondues
Oui c'est cela :)

Si c'est la deuxième proposition et que tu souhaites conserver une trace de la table d'origine, ceci est probablement une solution intéressante :
SELECT id, Date, type FROM (
  SELECT Client_Like_ID AS id, Date, 'like' AS type FROM Client_Like
    UNION ALL
  SELECT Client_Reco_ID, Date, 'reco' FROM Client_Like
)
ORDER BY Date DESC LIMIT 0,5
Je testerai ça apres ma pause déjeuner, merci beaucoup en tout cas de ton aide =D>

Re: Tri par date simultanémant sur deux tables différentes

Posté : 28 juil. 2010, 14:05
par AoSiX
Alors juste pour clore le sujet et le passé en résolu, la requête marche à un détail près, l'expression apres le FROM doit obligatoirement avoir un alias, en gros ça donne :
SELECT id, Date, type
FROM (
  SELECT Client_Like_ID AS id, Date, 'like' AS type FROM Client_Like
    UNION ALL
  SELECT Client_Reco_ID, Date, 'reco' FROM Client_Reco
) as tmp
ORDER BY Date DESC LIMIT 0,5
Merci beaucoup pour ton aide !