SQL - Определение исходной таблицы из запроса UNION - PullRequest
18 голосов
/ 10 сентября 2009

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

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

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

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

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

Спасибо.

Ответы [ 4 ]

27 голосов
/ 10 сентября 2009

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

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

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

13 голосов
/ 10 сентября 2009

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

$sql = "
SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3";
0 голосов
/ 13 ноября 2018

приведенный ниже запрос работает лучше и дает вам лучшее представление, так как приведенные выше запросы не отображают строки дважды.

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, переверните левое соединение

0 голосов
/ 11 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...