powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / join 1 большой или 2-х маленьких таблиц
25 сообщений из 48, страница 1 из 2
join 1 большой или 2-х маленьких таблиц
    #39348650
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Вопрос новичка (да и может обсуждалось, не нашел):

Что быстрее (лучше?) два join одной большой таблицы (as tab1 ... as tab2) или два join маленьких разных таблиц?

Пример есть картотека, в ней шкафы с 2 полками(!!! только 2 и никак иначе), в которых могут находиться различные предметы.
Запросы - берем шкаф и смотрим что и на какой полке лежит.
Таблица ШКАФ - id,name
Таблица ПРЕДМЕТ - id,name

А вот дальше вопрос:

можно сделать 2 таблицы ПОЛКА1 и ПОЛКА2 в каждой поля id, id_шкафа, id_предмета. И запрос делать так:
Код: sql
1.
2.
3.
4.
5.
Select ШКАФ.id, ШКАФ.name, ПРЕДМЕТ1.name as p1, ПРЕДМЕТ2.name as p2  from ШКАФ 
inner join ПОЛКА1 on ПОЛКА1.id_шкафа = ШКАФ.id
inner join ПРЕДМЕТ1 on ПРЕДМЕТ1.id_шкафа = ПОЛКА1.id_предмета
inner join ПОЛКА2 on ПОЛКА2.id_шкафа = ШКАФ.id
inner join ПРЕДМЕТ2 on ПРЕДМЕТ2.id_шкафа = ПОЛКА2.id_предмета



Либо сделать одну таблицу ПОЛКА, но в ней указать ключ разделения, т.е. id, id_шкафа, id_предмета, KEY_ПОЛКА
и тогда:
Код: sql
1.
2.
3.
4.
5.
Select ШКАФ.id, ШКАФ.name, ПРЕДМЕТ1.name as p1, ПРЕДМЕТ2.name as p2  from ШКАФ 
inner join ПОЛКА as ПОЛКА1 on ПОЛКА1.id_шкафа = ШКАФ.id and KEY_ПОЛКА=1
inner join ПРЕДМЕТ1 on ПРЕДМЕТ1.id_шкафа = ПОЛКА1.id_предмета
inner join ПОЛКА as ПОЛКА2 on ПОЛКА2.id_шкафа = ШКАФ.id and KEY_ПОЛКА=2
inner join ПРЕДМЕТ2 on ПРЕДМЕТ2.id_шкафа = ПОЛКА2.id_предмета



Естественно во втором случае таблица ПОЛКА будет равняться (по кол-ву строк) сумме (ПОЛКА1 + ПОЛКА2) в первом варианте.

Какой вариант лучше? Или может вообще лучше делать иначе? (но какой из этих вариантов лучше - все равно интересно)
PS. Перемещения с полки на полку практически нет.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348788
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
saya812,

Нужны 2 таблицы - место хранения и объект хранения.
Для выбора потребуется 1 жойн.
Место хранения должно содержать и номер шкафа, и номер полки (лучше сквозной, т.е. уникальный)
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348796
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это если предметы уникальны. Если нет - потребуется связь многие со многими через промежуточную таблицу - объект на хранении
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348797
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Три таблицы:
Шкафы
Полки
Предметы

Шкафы: id_шкафа(AI), ОписаниеШкафа
Полки: id_полки(AI), ОписаниеПолки, id_шкафа
Предметы: id_предмета(AI), ОписаниеПредмета, id_полки

Нельзя ставить в одну таблицу Предметы id_полки и id_шкафа
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348801
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
id_Предмета, ОписаниеПредмета, id_полки
FROM 
Предметы 
WHERE 
id_полки in 
(SELECT id_полки FROM Полки WHERE id_шкафа=НужныйНомерШкафа)
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348805
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По моей схеме должно быть так:
Шкаф 1 содержит полки 1 и 2; полка 1 содержит предметы 1,2,3,4; полка 2 содержит предметы 5,6,7,8;
Шкаф 2 содержит полки 3 и 4; полка 3 содержит предметы 9,10,11,12; полка 2 содержит предметы 13,14,15,16;

Кстати предметы на полках могут быть не уникальными
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348869
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица шкафов.
Таблица полок, ссылающаяся на таблицу шкафов.
Таблица предметов.
Таблица соответствия предмет-полка.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348871
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно криво написал - таблица "предмет" - фактически справочник предметов. То есть там должны быть уникальные предметы. Но в шкафу эти предметы могут повторяться, и сочетаться в любых комбинациях.

авторпотребуется связь многие со многими через промежуточную таблицу
В качестве этой таблицы у меня выступает таблица "ПОЛКА" - она связывает место хранения "ШКАФ" и объект хранения "ПРЕДМЕТ".
Объект "полка" фактически не существует - у него нет никаких свойств, только номер 1 или 2.


авторТри таблицы:
Шкафы
Полки
Предметы

Шкафы: id_шкафа(AI), ОписаниеШкафа
Полки: id_полки(AI), ОписаниеПолки, id_шкафа
Предметы: id_предмета(AI), ОписаниеПредмета, id_полки
У предметов много уникальных свойств и хранить их тысячами раз не хотелось бы - таблица "предметы" в это случае будет разбита на две - во вторую будут вынесены "ОписаниеПредмета" (которые уникальны), и опять получаем многие к многим...
авторШкаф 1 содержит полки 1 и 2; полка 1 содержит предметы 1,2,3,4; полка 2 содержит предметы 5,6,7,8;
Шкаф 2 содержит полки 3 и 4; полка 3 содержит предметы 9,10,11,12; полка 2 содержит предметы 13,14,15,16;
Не совсем :
Шкаф 1 содержит полки 1 и 2; полка 1 содержит предметы 1*100,2*50,3*20,4; полка 2 содержит предметы 1*50,2*1000,3*10,8;
И т.д.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348876
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaТаблица шкафов.
Таблица полок, ссылающаяся на таблицу шкафов.
Таблица предметов.
Таблица соответствия предмет-полка.
Да, все так - только т.к. полок реально нет и они не нужны - это и есть таблица соответствия шкаф-предмет. Только нужно еще добавить 1 свойство (bool) в это соответствие.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348891
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saya812и они не нужны
Если верить тому, что пишется выше - нужны.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348922
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaЕсли верить тому, что пишется выше - нужны.
Похоже я что-то туплю, и уже начинаю это чувствовать... Еще пару магических пенделей и...

По другому - давайте заменим полку любым булевым определением - например цветом (белый или черный)

есть справочник предметов id, prop
есть таблица (справочник) шкафов - id, prop

Нужна связывающая таблица - шкаф-предмет с доп свойством "цвет"...
таблица ШП - id, id-шкафа, id-предмета, цвет.
но join-а все равно 2 для выбора.

В общем похоже не до конца понимаю "многое к многому", пошел читать.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348951
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
add:
А еще - если мне надо получить таблицу с колонками:
шкаф, черный предмет, белый предмет
связывающую таблицу мне придется 2 раза подключать? И не будет ли лучше ее разбить на две (по цвету) и подключать две разные но маленькие вместо подключения двух раз одной большой.

Или такую таблицу лучше формировать уже сторонними средствами, получая от базы простую "шкаф, предмет, цвет"?
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39348995
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saya812предмет с доп свойством "цвет"то есть цвет - это атрибут предмета, и никак не связан ни со шкафом, ни с тем, в каком шкафу он лежит.
Чую, ты доупрощался...
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349003
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Булевое значение - не годиться.

Нужно оставить как я написал. Только из таблицы Предметы убрать id_полки
авторТри таблицы:
Шкафы
Полки
Предметы

Шкафы: id_шкафа(AI), ОписаниеШкафа
Полки: id_полки(AI), ОписаниеПолки, id_шкафа
Предметы: id_предмета(AI), ОписаниеПредмета

Нельзя ставить в одну таблицу Предметы id_полки и id_шкафа

И добавить четвертую таблицу ТблПредметыНаПолках: id_пнп(AI), id_полки, id_предмета, КоличествоПредметовПокладенныхНаПолку

Подозреваю КоличествоПредметовПокладенныхНаПолку будет у Вас всегда 1 или если Вы их туда кладете пачками, то более.

Таблица ТблПредметыНаПолках будет иметь вид
Код: plaintext
1.
2.
3.
4.
5.
id_пнп(AI), id_полки, id_предмета, КоличествоПредметовПокладенныхНаПолку
1              1            2                 2 
2              2            3                 1
3              1            2                 1
4              3            5                 5  

Запрос из первого поста ТС будет иметь вид
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
id_Предмета, ОписаниеПредмета, id_полки, SUM(КоличествоПредметовПокладенныхНаПолку)
FROM 
ТблПредметыНаПолках JOIN Предметы ON Предметы.id_полки=ТблПредметыНаПолках.id_полки
WHERE 
Полки.id_полки in 
(SELECT id_полки FROM Полки WHERE id_шкафа=НужныйНомерШкафа) GROUP BY id_Предмета
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349006
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я правильно понял что булевое значение для определения IF (полка=верхняя) THEN bool=TRUE else bool=FALSE
Да?
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349018
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такс...
Вы написали изначально, что полки есть и их 2. Теперь их нет. Если их нет, то таблицу Полки убираем. Таблица ПредметыНаПолках должна ссылаться на таблицу Шкафы.

Три таблицы:
Шкафы
Полки
Предметы

Шкафы: id_шкафа(AI), ОписаниеШкафа
ТблПредметыВШкафах: id_пнп(AI), id_шкафа, id_предмета, КоличествоПредметовПокладенныхВШкаф
Предметы: id_предмета(AI), ОписаниеПредмета

Таблица ТблПредметыВШкафах будет иметь вид

Код: plaintext
1.
2.
3.
4.
id_пнп(AI), id_шкафа, id_предмета, КоличествоПредметовПокладенныхНаПолку
1              1            2                 2 
2              2            3                 1
3              1            2                 1
4              3            5                 5  
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
id_Предмета, ОписаниеПредмета, id_шкафа, SUM(КоличествоПредметовПокладенныхВШкаф)
FROM 
ТблПредметыВШкафах JOIN Предметы ON Предметы.id_шкафа=ТблПредметыВШкафах.id_шкафа
WHERE 
id_шкафа=НужныйНомерШкафа GROUP BY id_Предмета
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349045
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня ошибка
Код: sql
1.
Предметы.id_предмета=ТблПредметыВШкафах.id_предмета
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349120
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторто есть цвет - это атрибут предмета, и никак не связан ни со шкафом, ни с тем, в каком шкафу он лежит.
Чую, ты доупрощался...
Я просто попытался пример подобрать похожий. Идея просто в том что связь многие со многими + атрибут, который не можно выделить отдельно.
CosmagnettoЯ правильно понял что булевое значение для определения IF (полка=верхняя) THEN bool=TRUE else bool=FALSE
Да?
Да, можно и так.
авторid_пнп(AI), id_шкафа, id_предмета, КоличествоПредметовПокладенныхНаПолку
1 1 2 2
Вот тут я усложнил (и больше запутал) пример написав о "кол-ве предметов"
Вот еще пример:
Таблица СЫР(на складе)
Код: plaintext
1.
2.
3.
4.
id, prop
1    aa
2    bb
3    cc
 .....
Справочник СТРАНЫ
Код: plaintext
1.
2.
3.
id, name
1    ру
2    гер
3    ита
А в выборке нужно в 95% случаев получать таблицу вида:
id_сыра, prop_сыра, страны экспорта, страны импорта
Тогда связывающая таблица СЫР_СТРАНА будет
Код: plaintext
1.
2.
3.
4.
5.
id, id_СЫР, id_СТРАНЫ, экспорт-импорт(bool)
1       1          1               0
2       1          2               0
3       1          3               1
4       2          1               0
5       2          2               1

А получить надо таблицу типа:

Код: plaintext
1.
2.
3.
4.
id_СЫР   prop_сыр     экспорт        импорт
     1       aa          ру           ита  
     1       aa          гер          ита  
     2       bb          ру           гер  
     3       сс          -            - 

Я пишу запрос
Код: sql
1.
2.
3.
4.
5.
6.
Select СЫР.id, СЫР.prop, exp.name as exp, imp.name as imp 
from `СЫР`
inner join СЫР_СТРАНА as exp1 on exp1.id_СЫР = СЫР.id and exp1.экспорт-импорт=0
inner join СТРАНА as exp on exp.id=exp1.id_СТРАНЫ
inner join СЫР_СТРАНА as imp1 on imp1.id_СЫР = СЫР.id and exp1.экспорт-импорт=1
inner join СТРАНА as imp on imp.id=imp1.id_СТРАНЫ


Но чую что это какой-то индусский метод))))
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349132
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мутно что-то...
я так и не понял задачу. Из примера (результата) сформировать себе задачу и соответственно решение не получается
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349154
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saya812Идея просто в том что связь многие со многими + атрибут, который не можно выделить отдельно.
Это ЧЕЙ, ипона мать, атрибут? какой сущности атрибут, в такую таблицу и заколачивай. А у тебя атрибут одной сущности запихивается в таблицу, где хранятся экземпляры другой сущности - и чего, спрашивается, косяки прут?
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349167
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaЭто ЧЕЙ, ипона мать, атрибут? какой сущности атрибут, в такую таблицу и заколачивай. А у тебя атрибут одной сущности запихивается в таблицу, где хранятся экземпляры другой сущности - и чего, спрашивается, косяки прут?

Это атрибут страны - то есть страна либо экспорта либо импорта.
Можно "заколотить" его в справочник СТРАНЫ, но тогда этот справочник станет в 2 раза больше - то есть получиться что каждая строчка в нем будет дублироваться (до одного бул. значения).
Так стоит делать?
Но с точки зрения запроса это мало на что повлияет просто "and exp1.экспорт-импорт=1" перейдет в другой join.

авторМутно что-то...
я так и не понял задачу.
Нужно получить таблицу всех значений СЫРОВ с колонками ЭКСПОРТ и ИМПОРТ, содержащими страны (для удобных сортировок, выборок).
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349170
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
saya812Но с точки зрения запроса это мало на что повлияет просто "and exp1.экспорт-импорт=1" перейдет в другой join.

Нет, тут ошибся, повлияет - это условие совсем отвалится.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349177
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторА в выборке нужно в 95% случаев получать таблицу вида:
id_сыра, prop_сыра, страны экспорта, страны импорта
Тогда связывающая таблица СЫР_СТРАНА будет
Как это в 95% случаев? Селекты работают в 100% случаев и выдают выборки на 100% соответствующие заданным значениям.

Я когда про задачу спрашивал, я ожидал услышать это:

Сделать выборку пар стран, которые продают друг другу сыры с указанием типа сыра

То есть
рус продает гер сыр 1
гер продает рус сыр 2
рус продает ита сыр 1
гер продает ита сыр 3

Я правильно угадал задание? ))))))))))))
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349186
saya812
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CosmagnettoКак это в 95% случаев? Селекты работают в 100% случаев и выдают выборки на 100% соответствующие заданным значениям.

Это я про то что это будет основным запросом. То есть понятно что будет и другая работа с таблицей, но основная именно эта.
CosmagnettoТо есть
рус продает гер сыр 1
гер продает рус сыр 2
рус продает ита сыр 1
гер продает ита сыр 3

Я правильно угадал задание? ))))))))))))
Да, только еще в этой таблице должны быть сыры без стран экспорта и/или импорта
например строка
"пусто" продает "пусто" сыр 4

То есть мы должны понимать что сыр есть, но стран у него нет.
...
Рейтинг: 0 / 0
join 1 большой или 2-х маленьких таблиц
    #39349191
Cosmagnetto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может страна и покупать и продавать один и тот же сыр?
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / join 1 большой или 2-х маленьких таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]