|
Объединение 2-х таблиц по полям varchar
|
|||
---|---|---|---|
#18+
Всем привет! Есть две таблицы (упрощенное описание). 1. Таблица с товарами (products). Содержит название, артикул (varchar(33)), производитель (varchar(33)). 2. Таблица с ценами продавцов (prices). Содержит артикул (varchar(33)), производитель (varchar(33)), цену товара. В первой таблице около 15000 позиций, во второй таблице с предложениями сотни тысяч. Вторая таблица обновляется 5-10 раз в сутки новыми предложениями Задача сделать следующее: 1. Вывести из первой таблицы только те товары, по которым есть предложения. Раньше артикул и производитель были вынесены в отдельные таблицы и в таблице с товарами были указаны ID. И в условии было SELECT * FROM products WHERE EXISTS(SELECT id FROM prices WHERE prices .article_id=products.article_id AND prices.brand_id=products.brand_id). Это работало быстро. Но если делать тоже самое, но по полям varchar, то все виснет. 2. Получить все предложения по товару. Вопрос: как оптимально сделать связь этих двух таблиц (возможно, через третью)? Через ID производителя и ID артикула в самих таблицах решил отказаться, чтобы не было лишних данных. Или я не прав? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2018, 12:24 |
|
Объединение 2-х таблиц по полям varchar
|
|||
---|---|---|---|
#18+
ilich.ism, Использование строковых полей в качестве ключевого поля не самый лучший вариант, но если данные приходят из вне то сойдет. начните с того что создайте индекс на products.артикул. В конкретно Вашем случае я бы добавил в таблицу prices поле idProduct с ссылкой на products.id, который заполнялся бы уже после загрузки данных + 2 индекса products.артикул, prices.idProduct . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2018, 19:38 |
|
Объединение 2-х таблиц по полям varchar
|
|||
---|---|---|---|
#18+
ilich.ismерез ID производителя и ID артикула в самих таблицах решил отказаться, чтобы не было лишних данных.Ноборот, если вынести производителя в отдельный справочник, а в таблицах использовать его ID, то будет и данных меньше, и скорость работы запросов выше. Артикулы тоже, возможно, имеет смысл в справочник вынести, но это надо детально на данные смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2018, 19:55 |
|
Объединение 2-х таблиц по полям varchar
|
|||
---|---|---|---|
#18+
Т.е. все-таки выносить в отдельные таблицы? А если сделать промежуточную таблицу, где сопоставить артикулы и производители? Хотя все равно связь по полю varchar остается... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2018, 20:44 |
|
Объединение 2-х таблиц по полям varchar
|
|||
---|---|---|---|
#18+
ilich.ism, 3 справочника- наименование товары, артикул, производитель этого достаточно чтоб сделать всё через индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2018, 07:16 |
|
Объединение 2-х таблиц по полям varchar
|
|||
---|---|---|---|
#18+
ilich.ism1. Вывести из первой таблицы только те товары, по которым есть предложения. Раньше артикул и производитель были вынесены в отдельные таблицы и в таблице с товарами были указаны ID. И в условии было SELECT * FROM products WHERE EXISTS(SELECT id FROM prices WHERE prices .article_id=products.article_id AND prices.brand_id=products.brand_id). Может туплю, а разве SELECT DISTINCT ... INNER JOIN эту задачу не решает? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2018, 10:29 |
|
Объединение 2-х таблиц по полям varchar
|
|||
---|---|---|---|
#18+
paverSELECT DISTINCT ... INNER JOIN эту задачу не решает?решает, если его использовать, но индексы и справочники позволят ещё более ускорить такое решение ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2018, 11:26 |
|
|
start [/forum/topic.php?fid=47&msg=39751942&tid=1829398]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
141ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 253ms |
0 / 0 |