Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Объединение в базу по не полному совпадению


Автор: Roksalana 30.5.2006, 13:47
Доброго времени суток. Ни как не могу придумать правильный запрос. Увидела Ваш форум и решила спросить. 
Суть проблемы: есть две таб (БД MySQL, на всякий случай smile ). Во второй таблице содержатся коды, а в первой поле, значение которого = код из таб2 и любое число. 
Т.е первая:
1234335434 
1653233454
5466377835
(числа - рандомайз по клавеsmile не критично)
Вторая:
123
756
346
и т.п
Нужно посчитать сколько записей в таб1 начинается с кодов таб2. 
Конечно можно выбрать отдельно каждый код из таб2 и искать уже его в таб1 (нечто вроде select * from таб1 where поле like '<заранее выбранный код из таб2>%' ), но хотелось бы единым запросом  smile 
Пробовала так:
SELECT count(*) FROM таб1 , таб2
WHERE таб1.поле LIKE  таб2.поле || '%'  group by таб2.поле, но ИМХО, полная чушь. Очень надеюсь, что мне тут помогут  smile  Заранее всем спасибо. 

Автор: batigoal 30.5.2006, 14:06
Во второй таблице длина чисел фиксирована?

Если да, тогда будет что-то типа
Код

select count(*) from table_1 where substr(value,1,3) in (select * from table_2)
 

Автор: skyboy 30.5.2006, 14:09
длина записей во второй таблице одна и та же(3 символа) или варьируется в пределах таблицы? 

Автор: Akina 30.5.2006, 14:20
Если количество разрядов во второй таблице не фиксировано, при объединении получится соотношение многие-ко-многим, что даст декартово произведение и дублирование строк в выходном запросе.

А так - что-то вроде
Код
Select count(*) As C
from
(
Select substr(value,1,3) As X
From Table1
) As T1
Inner join 
(
Table2 As T2
)
On T1.X=T2.Code
 

Автор: Roksalana 30.5.2006, 14:40
2 skyboy -> Нет, длинна варьируется smile
2 Akina -> мускул, что стоит у нас, не поддерживает вложенные запросы smile
Проблема еще в том, что совпадать должен код наибольшей длинны, т.е если есть 1234 и 12 в таб2, то посчитать запись из таб1 12345678 нужно, как запись относяшуюуся к 1234, а не к 12.
ЗЫ: пошла рыть регулярные выражения, вот только объединение тут меня смущает... 

Автор: Akina 30.5.2006, 15:50
Цитата(Roksalana @  30.5.2006,  15:40 Найти цитируемый пост)
Проблема еще в том, что совпадать должен код наибольшей длинны, т.е если есть 1234 и 12 в таб2, то посчитать запись из таб1 12345678 нужно, как запись относяшуюуся к 1234, а не к 12.

О! так это именно то о чем я говорил...

Цитата(Roksalana @  30.5.2006,  15:40 Найти цитируемый пост)
мускул, что стоит у нас, не поддерживает вложенные запросы 

Пора апгрыжить, значит...

Цитата(Roksalana @  30.5.2006,  15:40 Найти цитируемый пост)
если есть 1234 и 12 в таб2, то посчитать запись из таб1 12345678 нужно, как запись относяшуюуся к 1234, а не к 12.
не понял... кто говорил что
Цитата(Roksalana @  30.5.2006,  14:47 Найти цитируемый пост)
Нужно посчитать сколько записей в таб1 начинается с кодов таб2.
?  да и твой селект в первом посте тоже пытается считать кучей... а теперь оказывается что считать надо по каждой записи из таблицы 2 отдельно, да еще без дублей...

 

Автор: Roksalana 30.5.2006, 16:03
Цитата(Akina @ 30.5.2006,  15:50)
?  да и твой селект в первом посте тоже пытается считать кучей... а теперь оказывается что считать надо по каждой записи из таблицы 2 отдельно, да еще без дублей...

именно по тому мой селект в первом посту и не работает  smile  результат должен быть нечто вроде этого
поле таб2 | кол-во записей в таб 1, оносящихся к полю таб2
123           |  78
12345       |  13
и т.п. 

Автор: Akina 30.5.2006, 16:13
Цитата(Roksalana @  30.5.2006,  15:40 Найти цитируемый пост)
мускул, что стоит у нас, не поддерживает вложенные запросы 

А Temporary Table он поддерживает? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)