2009-09-10 5 views
12

Я создаю RSS-канал в PHP, который использует данные из трех отдельных таблиц. Все таблицы относятся к страницам в разных областях сайта. У меня есть проблема с созданием полей ссылок в XML. Не зная, из какой таблицы берутся записи, я не могу создать правильную ссылку на нее.SQL - Идентификация исходной таблицы из запроса UNION

Есть ли способ решить эту проблему? Я попытался использовать mysql_fetch_field, но он вернул пустые значения для таблиц.

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

Имеются другие области, но это в основном запрос, который я использую.

Любая помощь будет оценена по достоинству.

Спасибо.

ответ

10

Должно быть достаточно легко, просто сделать что-то вроде этого:

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

Так как там не было дубликатов для удаления, когда вы это делаете, используйте Union all. – HLGEM

22

Просто добавьте константу в свой список столбцов следующим образом:

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 

который получит вам что-то вроде:

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

и так далее.

Это позволяет вам иметь строковые типы данных, которые, скорее всего, упростят преобразование в ссылки (особенно если вы используете значения, которые нужно скопировать на вашу страницу вместо того, чтобы их искать или конвертировать), а с помощью предложения as будет позвольте вам ссылаться на него как на любой другой столбец (по имени).

Обратите внимание на использовании union all - если вы уверены, что не будет никаких повторяющихся строк из таблиц (что, вероятно, верно в данном случае, так как у вас есть другое table_name значения для каждого и я предполагаю названия уникальны), union all может избежать расточительной операции сортировки и удаления дубликатов. Использование union само по себе может привести к ненужной работе.

Если вы хотите удалить дубликат, просто вернитесь к использованию union.

+0

Выполнение этого может привести к дублированию записей независимо от того, используете ли вы объединение или объединение всех. – Zoop

0

Добавить фиктивную колонку с постоянной долиной. Например. «Выберите« funky_table »как source_table, название из funky_table» для каждого предложения, но с разными именами в кавычках.

Смежные вопросы