MySQL : UNION ALL pour une recherche unique sur plusieurs tables

Fabrice Webmastering 2 mn

sql-union-all
Dans le but de construire un moteur de recherche global il peut-être utile d’effectuer une union de plusieurs requêtes. Cela permet de regrouper les résultats pour avoir, par la suite, un affichage homogène.

Le seul inconvénient, c’est qu’il faut que les requêtes utilisent le même nombre de colonnes avec des types de données et un ordre identique (dans l’exemple id et title).


SELECT SQL_CALC_FOUND_ROWS * FROM (
				
	SELECT table1_id, table1_title, 'table1' as 'table' FROM table1 
	WHERE table1_title LIKE '%keyword%' 
					
	UNION ALL
					
	SELECT table2_id, table2_title, 'table2' as 'table' FROM table2
	WHERE table2_title LIKE '%keyword%'
																		  
) tmp_table 
ORDER BY RAND()

Grâce à l’utilisation de SQL_CALC_FOUND_ROWS, le nombre total de résultats peut se retrouver avec SELECT FOUND_ROWS().
Enfin sachez que lors de la boucle, vous devrez utiliser les noms des colonnes de la première requête (dans l’exemple table1_id et table1_title.