SQL - Identificar tabela de origem de consulta UNION
Pergunta
Eu estou construindo um RSS feed em PHP que usa dados de três tabelas separadas. As tabelas todos se referem a páginas dentro de diferentes áreas do site. O problema que tenho é tentar criar os campos link dentro da XML. Sem saber qual tabela cada registro veio, eu não posso criar o link correto para ele.
Existe uma maneira de resolver este problema? Eu tentei usar mysql_fetch_field, mas retornou valores em branco para as tabelas.
$sql = "
SELECT Title FROM table1
UNION
SELECT Title FROM table2
UNION
SELECT Title FROM table3";
Existem outros campos envolvidos, mas isso é basicamente a consulta que estou usando.
Qualquer ajuda seria apreciada.
Graças.
Solução
Deve ser bastante fácil, basta fazer algo como isto:
$sql = "
SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3";
Outras dicas
Basta adicionar uma constante à sua lista de coluna da seguinte forma:
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 você vai obter algo como:
table_name | title
-----------+-----------------------------
table1 | war and peace
table2 | 1984
table3 | terminator salvation
e assim por diante.
Isto permite-lhe ter tipos de dados texto que provavelmente irá fazer a sua conversão para ligações mais fácil (especialmente se você usar valores que apenas têm que ser copiado para sua página em vez de ser olhou para cima ou convertido) e usando a cláusula as
permitirá você para referenciá-lo como qualquer outra coluna (pelo nome).
Observe o uso de union all
- se você tem certeza de que não haverá linhas duplicadas das tabelas (que é provavelmente verdade neste caso desde que você tem um valor table_name
diferente para cada e eu 'm assumindo que os títulos são únicos), o union all
pode evitar uma operação de tipo-e-remover duplicados desperdiçado. Uso de union
por conta própria pode causar um trabalho desnecessário a ser feito.
Se você quiser a remoção duplicado pronto, basta voltar a usar union
.
Adicione uma coluna manequim com um vale constante. Por exemplo. "Select 'funky_table' como source_table, título de funky_table" para cada cláusula, mas com diferentes nomes nas cotações.
o abaixo consulta funciona melhor e dá-lhe uma melhor ideia como consultas acima não aparecerem linhas duas vezes.
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
o script acima não dão linhas de dados duplicados e certifique-se
- Tudo de dados comum bteween t1 e t2 como tabela de origem t1.
- Não fonte linhas t2 como a tabela t1.
- Não fonte de linhas T1 como a tabela t2.
Se você quiser dados comuns da tabela t2, aleta esquerda juntar