SQL – определение исходной таблицы из запроса UNION

StackOverflow https://stackoverflow.com/questions/1404890

  •  05-07-2019
  •  | 
  •  

Вопрос

Я создаю 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

приведенный выше сценарий не выдает повторяющиеся строки данных и убедитесь, что

  1. Все общие данные между t1 и t2 в виде исходной таблицы t1.
  2. Источником строк, отличных от t2, является таблица t1.
  3. Источником строк, отличных от t1, является таблица t2.

если вам нужны общие данные из таблицы t2, переверните левое соединение

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top