powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связка из 4 таблиц
6 сообщений из 6, страница 1 из 1
Связка из 4 таблиц
    #38581984
webphp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть кто подскажет.
Столкнулся с проблемой, еще ни разу такую выборку не делал хотелось бы понять как ее сделать.

Решил попробовать сделать что то вроде каталога авто и сейчас разрабатываю базу данных.

По просмотру различных каталогов (по просмотру внешне) начал создавать цепочку связей для более гибкого хранения данных.
На данном этапе получилась связка из 4-х таблиц, в первую таблицу записываю бренд с его url

ПС. первое поле у всех таблиц уникально.

catalogs
cid | brand | url

Пример:
1 | Rover | rover


Теперь к бренду нужно добавить модельный ряд

ragne
rid | catalog | model

Пример
1 | 1 | 25
2 | 1 | 75
3 | 1 | 45
4 | 1 | MG
5 | 1 | Mini MK
Т.е. при условии что url = rover (where url = 'rover')
Нужно выбрать всю подноготную из этих двух таблиц в виде многомерного массива
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
array(
    cid = 1,
    brand = Rover,
    url = rover
    
    [range] = array(
        [0] = array(
            rid = 1,
            catalog = 1,
            model = 25
        ),
        [1] = array(
            rid = 2,
            catalog = 1,
            model = 75
        ),
        [2] = array(
            rid = 3,
            catalog = 1,
            model = MG
        )
            
     )
);



Но это еще не все, нужно расширить информацию добавив еще две таблицы

По мимо модели, нужно выбрать еще и модификации данной модели
По этому создал еще одну таблицу со всеми модификациями

modification
mid | mrid | modific_name

Пример:
1 | 1 | 25
2 | 1 | 25 (RF)
Т.е. совмещаем range.rid = modification.mrid
Ну и уже расширяем многомерный массив и приводим его в виде
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
array(
    cid = 1,
    brand = Rover,
    url = rover,
    
    [range] = array(
        [0] = array(
            rid = 1,
            catalog = 1,
            model = 25,
            
            [modification] = array(
                [0] = array(
                    mid = 1,
                    mrid = 1,
                    model = 25
                ),
                [1] = array(
                    mid = 2,
                    mrid = 1,
                    model = 25 (RF)
                )
            )
        ),
        [1] = array(
            rid = 2,
            catalog = 1,
            model = 75
        ),
        [2] = array(
            rid = 3,
            catalog = 1,
            model = MG
        )
            
     )
);


Теперь у каждой модификации есть ряд двигателей, которые так же нужно выдернуть из базу
Создал еще одну таблицу
modification_group
mgid | mgmid | modific_group

Пример
1 | 1 | 1.4 V16 (103Hp)
2 | 1 | 1.6 V16 (109Hp)
3 | 1 | 1.8 V16 (145Hp)
И к каждой модификации нужно выбрать все данные с этой таблицы
modification_group.mgmid = modification.mid
И получить уже многомерный массив такого плана
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
array(
    cid = 1,
    brand = Rover,
    url = rover,
    
    [range] = array(
        [0] = array(
            rid = 1,
            catalog = 1,
            model = 25,
            
            [modification] = array(
                [0] = array(
                    mid = 1,
                    mrid = 1,
                    model = 25,
                    [modification_group] = array(
                        [0] = array(
                            mgid = 1,
                            mgmid = 1,
                            modific_group = 1.4 V16 (103Hp)
                        ),
                        [1] = array(
                            mgid = 2,
                            mgmid = 1,
                            modific_group = 1.4 V16 (84Hp)
                        ),
                        [2] = array(
                            mgid = 3,
                            mgmid = 1,
                            modific_group = 1.8 V16 (109Hp)
                        )
                        
                    ),
                ),
                [1] = array(
                    mid = 2,
                    mrid = 1,
                    model = 25 (RF)
                    [modification_group] = array(
                        [0] = array(
                            mgid = 4,
                            mgmid = 2,
                            modific_group = 1.4 V16 (103Hp)
                        ),
                        [1] = array(
                            mgid = 5,
                            mgmid = 4,
                            modific_group = 2/0 TD (101HP)
                        ),
                        [2] = array(
                            mgid = 6,
                            mgmid =4,
                            modific_group = 1.8 V16 (109Hp)
                        )
                    ),
                )
            )
        ),
        [1] = array(
            rid = 2,
            catalog = 1,
            model = 75
        ),
        [2] = array(
            rid = 3,
            catalog = 1,
            model = MG
        )
            
     )
);


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

Уже думал может сделать 3-4 запроса и делать выборку по таблично, но думаю это будет не совсем правильно, а может быть есть и какие то другие варианты, даже может быть структуру как то переделать чтобы не загоняться с такими запросами?

Марок и модификаций очень много и с моей точки зрения такая структура таблиц будет более гибкой в использовании, хотя может и ошибаюсь...
...
Рейтинг: 0 / 0
Связка из 4 таблиц
    #38581993
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webphp ,

прежде всего - SQL не работает с массивами !
Массивы, в вашем изложении, предполагают:
1. индексацию элементов
В рамках реляционной модели к таблице нельзя обращаться не только по номеру строки (ну нет такого понятия, по определению), но и по номеру столбца (так сказать, 0НФ).
2. сложную структуру элементов массива
А это уже прямое нарушение 1НФ

Посмотрите на эту тему бесплатный вебинар от specialist.ru

Теперь по сути вопроса.
Все, что вам нужно, - это обычный запрос к четырем таблицам, типа этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
  c.cid, c.brand, c.url
  , r.rid, r.catalog, r.model
  , m.mid, m.mrid, m.modific_name
  , g.mgid, g.mgmid, g.modific_group
from catalogs c
join ragne r on r.catalog=c.cid
left join modification m on m.mrid=c.cid
left join modification_group g on g.mgmid=m.mid
where c.url = 'rover';


ВСЁ!

Осталось навести легкий марафет: убрать, например, из выборки дублируемые поля-связи (например, r.catalog, m.mrid), обеспечить наличие необходимых индексов для ускорения выполнения выборки
...
Рейтинг: 0 / 0
Связка из 4 таблиц
    #38581999
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webphp,

Структура правильная пока.
Про массивы забудь, тебе надо видимо SQL подучить. Здесь тебя учить бессмысленно, тебе надо читать книги.

Голова болит - странно, в сколько нибудь стоящей бд обычно порядка 100 таблиц, если у тебя уже с четырех голова болит, то что будет дальше?
...
Рейтинг: 0 / 0
Связка из 4 таблиц
    #38582114
webphp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну собственно я и сделать что то вроде того
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public function index($data = array())
    {
        return $this->db->where($data)
                ->from(self::table)
                ->join(self::table_range, self::table_range . '.catalog = ' . self::table . '.cid')
                ->join(self::table_modification, self::table_modification . '.mrid = ' .self::table_range . '.rid', 'left')
                ->join(self::table_modification_group, self::table_modification_group . '.mgmid = ' . self::table_modification . '.mid', 'left')
                ->get()->result();
    }


Cygapb-007, я с mysql просто не ахти, все потихонечку набираюсь опыта, пытаюсь делать все более сложные выборки, просто думал что можно как то более гибко сделать выборку, а не свалить все в кучу, вот и ломал вчера голову над этим вопросом =)

MasterZivЗдесь тебя учить бессмысленно, тебе надо читать книги
Спасибо, но лучше вместо книг, буду практиковаться, теория конечно важна, но когда сам помучаешься, запомнишь на всегда, для меня просто теорию лучше постепенно подхватывать, а не все в кучу.
...
Рейтинг: 0 / 0
Связка из 4 таблиц
    #38582133
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webphpСпасибо, но лучше вместо книг, буду практиковатьснадо не вместо, а параллельно
...
Рейтинг: 0 / 0
Связка из 4 таблиц
    #38582145
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webphpСпасибо, но лучше вместо книг, буду практиковаться, теория конечно важна, но когда сам помучаешься, запомнишь на всегда, для меня просто теорию лучше постепенно подхватывать, а не все в кучу.
Вынужден Вас огорчить. Именно в случае SQL это заявление - наиболее глупое из всех возможных.
SQL - это совершенно иная идеология подхода к организации, хранению и обработке данных. И если соваться туда без предварительного глубокого освоения теории, шансов вынуть руки из задницы практически не будет.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связка из 4 таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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