SQL – определение исходной таблицы из запроса UNION
Вопрос
Я создаю RSS-канал на PHP, который использует данные из трех отдельных таблиц.Все таблицы относятся к страницам в разных областях сайта.Проблема, с которой я столкнулся, заключается в попытке создать поля ссылок в XML.Не зная, из какой таблицы взята каждая запись, я не могу создать на нее правильную ссылку.
Есть ли способ решить эту проблему?Я пробовал использовать mysql_fetch_field, но он возвращал пустые значения для таблиц.
$sql = "
SELECT Title FROM table1
UNION
SELECT Title FROM table2
UNION
SELECT Title FROM table3";
Есть и другие поля, но в основном это тот запрос, который я использую.
Любая помощь будет оценена по достоинству.
Спасибо.
Решение
Должно быть достаточно легко, просто сделайте что-то вроде этого:
$sql = "
SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3";
Другие советы
Просто добавьте константу в список столбцов следующим образом:
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
.
Добавьте фиктивный столбец с постоянным значением.Например.«Выберите «funky_table» в качестве source_table, заголовок из funky_table» для каждого предложения, но с разными именами в кавычках.
приведенный ниже запрос работает лучше и дает вам лучшее представление, поскольку приведенные выше запросы не отображают строки дважды.
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
приведенный выше сценарий не выдает повторяющиеся строки данных и убедитесь, что
- Все общие данные между t1 и t2 в виде исходной таблицы t1.
- Источником строк, отличных от t2, является таблица t1.
- Источником строк, отличных от t1, является таблица t2.
если вам нужны общие данные из таблицы t2, переверните левое соединение