Запрос из трех таблиц

Trippal
Дата: 04.01.2015 14:47:21
Добрый день уважаемые форумчане.
Всех с прошедшим Новым годом и наступающим Рождеством.

Объясню картину
Имеются три таблицы.
t1, t2, t3
Главная считается t1 (id, info, t2id, t3id)
Второй t2 (id, info, t3id)
Третьей t3 (id,info)
В t1 - t3id есть у всех записей, а t2id - у большинства(75%)(!!!самая большая загвоздка)
выбрать необходимо следующую последовательность
t1.id, t3.info, t2.info, t1.info, при этом есть вводные данные -конкатенация t3.info, t2.info, t1.info
сейчас выборка выглядит так:
SELECT t1.id,
t3.info,
t2.info,
t1.info
FROM t1
INNER JOIN t3 ON t3.id = t1.t3id
INNER JOIN t2 ON t2.id = t1.t2id
WHERE (concat(t3.info,' ', t2.info,' ', t1.info)) ILIKE ('%'||(REPLACE('текстовое наполнение полей',' ','%'))||'%')

теперь по-русски,
не получается написать запрос при котором будет одинаково работать следующая система поиска по полям
t3.info,t2.info,t1.info
t3.info, t1.info (так как не у всех записей есть информация из t2)
Так же есть в t2 нулевая строка, нулевую информацию из которой берет запрос(на эту строку ссылаются все строки из t1 в которых нет id второй таблицы)
в этом ключе и действовать, вложенными запросами не очень хочется решить эту проблемы.
поправил
Дата: 04.01.2015 14:59:17
Trippal
Добрый день уважаемые форумчане.
Всех с прошедшим Новым годом и наступающим Рождеством.

Объясню картину
Имеются три таблицы.
t1, t2, t3
Главная считается t1 (id, info, t2id, t3id)
Второй t2 (id, info, t3id)
Третьей t3 (id,info)
В t1 - t3id есть у всех записей, а t2id - у большинства(75%)(!!!самая большая загвоздка)
выбрать необходимо следующую последовательность
t1.id, t3.info, t2.info, t1.info, при этом есть вводные данные -конкатенация t3.info, t2.info, t1.info
сейчас выборка выглядит так:
SELECT t1.id,
t3.info,
t2.info, 
t1.info 
FROM t1
LEFT JOIN t3 ON t3.id = t1.t3id
LEFT JOIN t2 ON t2.id = t1.t2id 
WHERE (concat(t3.info,' ', t2.info,' ', t1.info)) ILIKE ('%'||(REPLACE('текстовое наполнение полей',' ','%'))||'%') 

теперь по-русски,
не получается написать запрос при котором будет одинаково работать следующая система поиска по полям
t3.info,t2.info,t1.info
t3.info, t1.info (так как не у всех записей есть информация из t2)
Так же есть в t2 нулевая строка, нулевую информацию из которой берет запрос(на эту строку ссылаются все строки из t1 в которых нет id второй таблицы)
в этом ключе и действовать, вложенными запросами не очень хочется решить эту проблемы.


помедленнееее, пэжаллст, я зэписссываю
Trippal
Дата: 04.01.2015 15:10:28
поправил
помедленнееее, пэжаллст, я зэписссываю

А что именно? :)
Maxim Boguk
Дата: 04.01.2015 15:21:19
Trippal,

SELECT t1.id,
t3.info,
t2.info,
t1.info
FROM t1
INNER JOIN t3 ON t3.id = t1.t3id
LEFT JOIN t2 ON t2.id = t1.t2id
WHERE (concat(t3.info,' ', coalesce(t2.info,''),' ', t1.info)) ILIKE ('%'||(REPLACE('текстовое наполнение полей',' ','%'))||'%')


по логике то что вы хотите

--Maxim Boguk
www.postgresql-consulting.ru
поправил
Дата: 04.01.2015 15:34:59
Maxim Boguk
Trippal,

SELECT t1.id,
t3.info,
t2.info,
t1.info
FROM t1
INNER JOIN t3 ON t3.id = t1.t3id
LEFT JOIN t2 ON t2.id = t1.t2id
WHERE (concat(t3.info,' ', coalesce(t2.info,''),' ', t1.info)) ILIKE ('%'||(REPLACE('текстовое наполнение полей',' ','%'))||'%')


по логике то что вы хотите

--Maxim Boguk
www.postgresql-consulting.ru

макс, конкат , вотличь от такого же оператора, игнорабит нуллы, т.ч. вы зря коалестите внутре оного

2 ТС ты куй,
куй, говорю, оно и выкуется
Trippal
Дата: 04.01.2015 15:36:22
Maxim Boguk,

по логике:
есть три таблицы дома, улицы, деревни
в таблице домов есть id дома, геометрия дома, id деревень (из таблицы деревень) и id улиц (из таблицы улиц), но не во всех домах есть id улиц, так как улиц в деревне просто нет,
мне нужно найти геометрию дома и составной адрес по определенной форме id дома, название деревни, название улицы, номер дома, геометрия дома
адрес разнесен в эти три таблицы
то есть мы вводим Иваново Центральная 1 - получаем таблицу новую
или Петрово 2
поправил
Дата: 04.01.2015 15:40:24
поправил
Maxim Boguk
Trippal,

SELECT t1.id,
t3.info,
t2.info,
t1.info
FROM t1
INNER JOIN t3 ON t3.id = t1.t3id
LEFT JOIN t2 ON t2.id = t1.t2id
WHERE (concat(t3.info,' ', coalesce(t2.info||' ',''), t1.info)) ILIKE ('%'||(REPLACE('текстовое наполнение полей',' ','%'))||'%')


по логике то что вы хотите

--Maxim Boguk
www.postgresql-consulting.ru

макс, конкат , вотличь от такого же оператора, игнорабит нуллы, т.ч. вы зря коалестите внутре оного

2 ТС ты куй,
куй, говорю, оно и выкуется

хотя макс возможно вот так хотел сказать
шар хрустальный жеж
мутный
поправил
Дата: 04.01.2015 15:51:01
Trippal
Maxim Boguk,

по логике:
есть три таблицы дома, улицы, деревни
в таблице домов есть id дома, геометрия дома, id деревень (из таблицы деревень) и id улиц (из таблицы улиц), но не во всех домах есть id улиц, так как улиц в деревне просто нет,
мне нужно найти геометрию дома и составной адрес по определенной форме id дома, название деревни, название улицы, номер дома, геометрия дома
адрес разнесен в эти три таблицы
то есть мы вводим Иваново Центральная 1 - получаем таблицу новую
или Петрово 2
для поиска дешевле разложить регекспом на элементы, вычислить количество (а тем самым - и назначение элемента).

но при составных названиях будет сбоить.
типа "малые пердюки 2" -- малые -- деревня, пердюки -- улицца
ну а всякие верхненижние подзалупинки со страшего генарал атамана кривожопова улицей -- вообще празднк души и т.п.
тут уж о скорости сложно, тут в ваши конкаты от нездоровья и подашься
хотя я бы регекспанул с вариативностью -- битмапом-ором несколько вариаций обсчитать -- это не сексканы полные сконкатенатить
Trippal
Дата: 04.01.2015 16:14:48
поправил,
совсем сложный вариант.
Trippal
Дата: 04.01.2015 16:26:00
ТЕМА ЗАКРЫТА, СДЕЛАЛ САМ)
всем спасибо!