Recherche
Peut être aimerez-vous...
Sections du site
Sites Neamar
Lisez ces articles !
| Maîtriser l'UNION SQL |
|
| Programmation et tuning - Programmation Web |
| Écrit par Neamar |
| Jeudi, 24 Septembre 2009 19:52 |
|
Petite mise en situation... La première solution consisterait à faire autant de requêtes que vous avez de tables, et à comparer "manuellement" chacun des résultats. Long, peu efficace et difficile à maintenir. ProblématiqueVous savez peut être faire une jointure SQL : cette opération puissante et relativement simple permet de "coller" des données dans vos résultats. Cependant, l'ajout ne crée pas de "nouvelles lignes" (en tout cas, pas dans le sens où nous l'entendons, puisque pour un attribut donné l'ensemble pris par les valeurs reste le même) ; l'opération se contentant d'ajouter des colonnes supplémentaires : en fait, il s'agit d'une insertion de données à la verticale. La jointure n'étant pas du tout le but de cet article, je vous laisse vous référer à des liens plus approfondis pour une explication concrète. Dans notre cas, nous serions plus intéressés par un ajout de données à l'horizontale : autrement dit, une sorte de mélange entre deux tables. La norme SQL prévoie cela, mais l'implémentation est assez peu connue... Syntaxe UNIONLe mot clé UNION permet de joindre deux résultats de requêtes (ou plus), sous certaines conditions :
Un exempleSupposons que nous ayons trois tables, qui stockent la date et des actions. Le but de l'exercice va être d'afficher les dix dernières actions, en fonction de la date, toutes tables confondues. Afin de faire simple et concis, nous allons prendre deux colonnes : une qui indiquera la date et l'autre la modification (nous leur donnerons les alias Date et Texte). Dans la réalité, vous aurez sûrement besoin de complexifier cela...
Voilà donc les trois requêtes que nous aurions dû exécuter séparément, et qu'UNION va "coller" pour nous. Dernière chose à faire : penser à trier en fonction de la date décroissante (les événements les plus récents en premier). Dans ce cas, j'ajoute aussi une colonne Type qui permet de voir d'un seul coup d'œil d'où provient la modification. SELECT UNIX_TIMESTAMP(Date) AS Date,CONCAT(Titre, " : ",Modification," par ", Auteurs.Auteur) AS Texte,"Article" AS Type FROM Modifs LEFT JOIN Articles ON (Articles.ID=Modifs.Reference) LEFT JOIN Auteurs ON (Auteurs.ID=Modifs.Auteur) UNION SELECT UNIX_TIMESTAMP(modified) AS Date, title AS Texte,"Blog" AS Type FROM zBLOG_content UNION SELECT UNIX_TIMESTAMP(Date) AS Date,CONCAT("<em>{",Projet,"}</em> ",Modification) AS Texte,"TL" AS Type FROM _TimeLine ORDER BY DATE DESC LIMIT 10 Et pour afficher les résultats (PHP) : echo '<ol>' . "\n"; while($Log=mysql_fetch_assoc($LogsSQL)) echo '<li><small>[<tt>' . $Log['Type'] . '</tt> | ' . date('d/m/y à G:i:s',$Log['Date']) . ']</small> '. $Log['Texte'] . '</li>'; echo '</ol>' . "\n"; Tadaaam ! Les curieux pourront voir ce que cela donne sur cette page [EDIT : page supprimée], taillée pour un affichage sur mobile (code le plus concis possible). |
| Mise à jour le Mercredi, 26 Mai 2010 23:37 |
