2012-03-09 3 views
0

У меня возникли проблемы с выяснением этого запроса. Я использую PHP и postgresql 9.1. Я хочу иметь возможность выбирать поля из строк на основе критериев в другом поле, например.Выберите два столбца из двух разных таблиц, каждый с разными именами столбцов

Таблица A имеет столбцы:

vid, title, description, col4, col5, col6, col7 

Таблица B имеет столбцы:

pid, title, description, colx, coly 

Я хочу искать title и description из обеих таблиц и если совпадение найдено, возвратите vid или pid из строки, в которой она была найдена.

Что я пробовал так далеко:

SELECT vid FROM tableA WHERE title LIKE %somevalue% 
UNION 
SELECT pid FROM tableB WHERE title LIKE %somevalue% 

Проблема заключается в том, когда я делаю это, и это находит совпадение для tableB, который возвращает правильное значение, но назначенный vid столбца в массиве. РНР массив отображает

Array ([0] => Array ([vid] => 100007)) 

Когда это должно быть

Array ([0] => Array ([pid] => 100007)) 

Это не дает мне правильное имя столбца для таблицы. Это дает мне только имя столбца первого оператора select.
Кроме того, он возвращает только тот или иной. Если значение найдено в обоих, я хочу оба значения с обоими столбцами.

+0

Наверняка кто-нибудь знает, как объединить операторов выбора, чтобы получить правильные результаты. Поскольку объединение неверно, какие подзапросы будут работать вместо этого? –

ответ

0
SELECT 
    a.vid, 
    b.pid 
FROM (
    SELECT vid, ROW_NUMBER() OVER (ORDER BY vid) AS rn 
    FROM tableA 
    WHERE title LIKE '%somevalue%' 
) a 
FULL JOIN (
    SELECT pid, ROW_NUMBER() OVER (ORDER BY pid) AS rn 
    FROM tableB 
    WHERE title LIKE '%somevalue%' 
) b 
ON a.rn = b.rn 
+0

Это очень близко к тому, что я ищу. Не знаю, как это работает, но оно работает. Хотя я бы предпочел, чтобы он не возвращал столбец, если он пуст, он по-прежнему является лучшим ответом и работает, как я хочу. Я буду использовать PHP для обработки пустого ключа/значения, которое я предполагаю. –

+0

Результат запроса должен содержать фиксированный набор столбцов. Если вы хотите, чтобы он был динамическим, сам запрос должен строиться динамически. Не уверен, что PostgreSQL позволяет создавать и выполнять динамические запросы, но я не сомневаюсь, что окончательный запрос будет более сложным, чем любое из предлагаемых здесь решений. Так что да, обращение с пустыми значениями в клиентском коде - хорошая идея, вот что я, скорее всего, решила бы сделать в любом случае. –

1

Вы можете написать что-то вроде:

SELECT 'vid' AS key, vid, NULL AS pid FROM tableA WHERE title LIKE ... 
UNION 
SELECT 'pid',  NULL, pid   FROM tableB WHERE title LIKE ... 
+0

не работает правильно, как мне нужно. То же самое, что и у Martin's –

+0

@Pjack: В этом случае звучит так, будто вы действительно не хотите 'UNION'! – ruakh

+0

Итак, что мне нужно, чтобы получить два имени столбца, в котором он находит значения? –

1

Что вы просите не представляется возможным с помощью одного запроса и UNION. Согласно w3schools, столбцы вынуждены сопоставлять первый оператор select при использовании UNION.

http://www.w3schools.com/sql/sql_union.asp

+0

ничего полезного:/все, что он делает, это вытащить имя столбца Array ([0] => Array ([vid] => 100007 [pid] =>)), но в нем не должно быть vid, должен быть массив ([0 ] => Array ([pid] => 100007)) –

+0

Я считаю, что SQL заставит все результаты иметь одинаковые столбцы при выполнении объединения. Почему бы просто не запустить два запроса? – Martin

+0

Итак, что мне нужно, чтобы получить два имени столбца, в котором он находит значения?Он должен быть в одном заявлении и не хорош с подборами. –

0

Try: -

SELECT vid as 'id', 'isVid' as idType FROM tableA WHERE title LIKE ... 
    UNION 
    SELECT pid as 'id', 'isPid' as idType FROM tableB WHERE title LIKE ... 
Смежные вопросы