2009-09-10 21 views
12

Estoy creando una fuente RSS en PHP que usa datos de tres tablas separadas. Todas las tablas se refieren a páginas dentro de diferentes áreas del sitio. El problema que tengo es tratar de crear los campos de enlace dentro del XML. Sin saber de qué tabla proviene cada registro, no puedo crear el enlace correcto para él.SQL - Identificación de la tabla fuente de la consulta UNION

¿Hay alguna manera de resolver este problema? Intenté usar mysql_fetch_field, pero devolvió valores en blanco para las tablas.

$sql = " 
SELECT Title FROM table1 
UNION 
SELECT Title FROM table2 
UNION 
SELECT Title FROM table3"; 

Hay otros campos involucrados, pero esta es básicamente la consulta que estoy usando.

Cualquier ayuda sería apreciada.

Gracias.

Respuesta

10

debe ser lo suficientemente fácil, basta con hacer algo como esto:

$sql = " 
SELECT Title, 1 FROM table1 
UNION 
SELECT Title, 2 FROM table2 
UNION 
SELECT Title, 3 FROM table3"; 
+1

Dado que no habrá ningún duplicado para eliminar cuando lo haga, utilice Union all en su lugar. – HLGEM

22

Sólo añadir una constante a su lista de columnas de la siguiente manera:

select 'table1' as table_name, title from table1 
union all 
select 'table2' as table_name, title from table2 
union all 
select 'table3' as table_name, title from table3 

que le llevará algo como:

table_name | title 
-----------+----------------------------- 
table1  | war and peace 
table2  | 1984 
table3  | terminator salvation 

y así sucesivamente.

Esto le permite tener tipos de cadenas de datos que harán que su conversión a enlaces sea más fácil (especialmente si usa valores que solo tienen que copiarse en su página en lugar de buscarlos o convertirlos) y usar la cláusula as te permite referenciarlo como cualquier otra columna (por nombre).

Nota el uso de union all - si está seguro de que no habrá filas duplicadas de las tablas (que es probablemente cierto en este caso ya que tiene un valor diferente para cada table_name y estoy suponiendo que el los títulos son únicos), el union all puede evitar una operación de sort-and-remove-duplicate desperdiciada. El uso de union por sí solo puede causar un trabajo innecesario.

Si desea realizar la eliminación duplicada, simplemente vuelva a usar union.

+0

Hacer esto podría dar como resultado registros duplicados independientemente de si usa unión o unión. – Zoop

0

Agregue una columna ficticia con un valor constante. P.ej. "Selecciona 'funky_table' como source_table, title from funky_table" para cada cláusula pero con diferentes nombres en las comillas.

Cuestiones relacionadas