Сравнение двуз стольбцов в разных таблицах

Veosys

Есть следующая задача:Две таблицы. В одной несколько сотен тысяч строк с названиями приборов и еще кое какой информацией. Название приборов выглядят примерно как ABCD-01, где ABCD - это собсно название а все остальное - типа модификации. Причем это не обязательно минус и две цифры. Во второй таблице, которая намного меньше два столбца - название прибора и его цена. Причем название - вида ABCD, т.е. общее для нескольких модификаций. Необходимо сделать выборку так, чтобы ко всем модификациям прибора ABCD из первой таблицы (например ABCD-01, ABCD-01, ABCDf34 и.т.д) выставить одинаковую цену из второй таблицы (если она там есть).
8 ответов

Veosys

и как отделять название от модификации?правильный вариант на самом деле - это переделать немного структуру таблицодна будет с id прибора, названием ценой, а другая - id прибора, модификация и остальная информациятогда соединение таблиц будет очень быстрое - по числовому уникальному id, а полное название прибора можно будет получить конкатенацией строк с названием и модификацией


Veosys

Да в том то вся и сложность, что первая таблица приходит от поставщика в текстовом файле, в котором нет разделения на название и серию, а есть именно на каждый прибор по несколько строк с разными модификациями. И написание названий вместе с модификацие настолько разное, что как то отпарсить это нереально. Можно только отлавливать совпадение названия из таблицы с ценами с первой частью строки, которая в первой таблице. Т.е. типа LIKE 'name%'. Но вот только LIKE тут не применишь.


Veosys

как быть, если есть например модификация ABCD123 и приборы ABCD1, ABCD12, как будете приборы выбирать?


Veosys

если по совпадению самой длинной подстроки, то вам сюда:http://sql.ru/forum/actualthread.aspx?tid=418597и в чем вопрос? как соединить таблицы? или придумать алгоритм разбиения на название и модификацию, который вы сами не знаете??


Veosys

IMHO от поставщика приходит файл, а не таблица. Вы как-то этот файл загружаете в мускуль. Вот на этапе загрузки и делите. Учитывая, что
на каждый прибор по несколько строк с разными модификациями
разбор будет не сложным.


Veosys

Поясняю на примере.Вот строки из таблицы с приборами на складе:SUS01L-05SUS01L-09SUS01L-15Вот строка из таблицы с ценами:SUS01 2,30Вот ко всем этим трем строчкам из складской таблицы надо на выходе подставить цену 2,30.Выход - это результат поиска по складу по введенному пользователем запросу. Причем в складской таблице цены в принципе есть, но во многих позициях просто забиты нулями по умолчанию. А вот конкретно для тех приборов, которые есть в маленькой таблице с ценами (которая выгружается из 1С если уж вдаваться в подробности) нужно эти нули заменить на реальные цены.Насчет длинны названий - она очень сильно варьируется, так что по длинне не разделишь. Насчет деления на этапе загрузки из текстового файла в мускуль - тоже нереально. Я же говорю, что позиций там сотни тысяч, и названия очень разные, так что отпарсить нет никакой возможности.
как быть, если есть например модификация ABCD123 и приборы ABCD1, ABCD12, как будете приборы выбирать?
Да, вот это уже вообще будет жопа. Но меня заверили, что таких совпадений не будет в данных.
и в чем вопрос? как соединить таблицы? или придумать алгоритм разбиения на название и модификацию, который вы сами не знаете??
Вопрос в том, можно ли сравнивать столбцы в разных таблица так чтобы если в первой стоит ABC, а во второй ABC1 то считать что строки совпали?Короче очень хочется, чтобы работал такой вот фантастический запрос:SELECT *.* FROM table1, table2 WHERE table1.name LIKE '%$zapros%' AND table1.name LIKE 'table2.name%' LIMIT $first, $ipp


Veosys

LIKE CONCAT(table2.name, '%') и будет работать


Veosys

Огромное спасибо Nick Anikin! Заработало!На всякий случай для тех у кого возникнет такая же задача привожу полностью запрос:SELECT table1.*, table2.* FROM table1 LEFT JOIN table2 ON table1.name LIKE CONCAT(table2.name, '%') WHERE table1.name LIKE '%$zapros%'