SQL - Identificando la tabla fuente de la consulta UNION
Pregunta
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.
¿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.
Solución
Debería ser lo suficientemente fácil, solo haz algo como esto:
$sql = "
SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3";
Otros consejos
Simplemente agregue 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 te dará algo como:
table_name | title
-----------+-----------------------------
table1 | war and peace
table2 | 1984
table3 | terminator salvation
y así sucesivamente.
Esto le permite tener tipos de datos de cadena que probablemente facilitarán su conversión a enlaces (especialmente si usa valores que solo deben copiarse en su página en lugar de buscarlos o convertirlos) y usar como La cláusula
le permitirá hacer referencia a ella como a cualquier otra columna (por nombre).
Tenga en cuenta el uso de union all
: si está seguro de que no habrá filas duplicadas de las tablas (que es probablemente verdadera en este caso, ya que tiene un valor diferente de nombre_tabla
para cada uno y supongo que los títulos son únicos), union all
puede evitar una operación desperdiciada de ordenar y eliminar duplicados. El uso de union
por sí solo puede provocar que se realicen trabajos innecesarios.
Si desea que se realice la eliminación de duplicados, simplemente vuelva a utilizar union
.
Agrega 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.
la consulta de abajo funciona mejor y te da una mejor idea, ya que las consultas anteriores no representan dos veces las filas.
SELECT t1.*,t1.table_name
FROM
t1
UNION ALL
SELECT t2.*,t2.table_name
FROM
t2
LEFT OUTER JOIN
t1
ON t1.id=t2.id
WHERE t1.id=null
la secuencia de comandos anterior no proporciona filas de datos duplicadas y se asegura de que
- Todos los datos comunes entre t1 y t2 como fuente t1.
- Origen de filas no t2 como tabla t1.
- Origen de filas no t1 como tabla t2.
si desea datos comunes de la tabla t2, gire la combinación hacia la izquierda