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.

Foi útil?

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

  1. Tudo de dados comum bteween t1 e t2 como tabela de origem t1.
  2. Não fonte linhas t2 como a tabela t1.
  3. Não fonte de linhas T1 como a tabela t2.

Se você quiser dados comuns da tabela t2, aleta esquerda juntar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top