powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос mysql 3.22.21
4 сообщений из 4, страница 1 из 1
запрос mysql 3.22.21
    #32397815
привет.

три таблицы:

Код: plaintext
1.
2.
3.
4.
CREATE TABLE peoples (
  id int( 10 ) unsigned NOT NULL auto_increment,
  name varchar( 255 ) NOT NULL default '',
  PRIMARY KEY (id)
)


Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE groups (
  id int( 10 ) unsigned NOT NULL auto_increment,
  name varchar( 255 ) NOT NULL default '',
  parent int( 10 ) unsigned NOT NULL default '0',
  PRIMARY KEY (id)
)


Код: plaintext
1.
2.
3.
4.
CREATE TABLE groups_peoples_rels (
  g_id int( 10 ) unsigned NOT NULL default '0',
  p_id int( 10 ) unsigned NOT NULL default '0',
  PRIMARY KEY (g_id, p_id)
)


по-человечески:
- есть список людей (peoples), есть список групп (groups).
- один человек может быть в нескольких группах.

пример списка групп (представлено как дерево)
начальники
- - гады
- - негады
подчиненные
- - умные
- - глупые
- - - - суперглупые
- - - - так себе
посторонние
- - продавцы
- - покупатели

например, человек "масяня" находится в группах:
- начальники/гады (принадлежит ТОЛЬКО последней группе, т.е. "гады"
- подчиненные/глупые/суперглупые
- покупатели

рассматривается группа "покупатели", в которой есть "масяня":
надо получить список корневых (выделены жирным ) групп, в дочерних элементах которых находится "масяня".

в общем: надо получить список корневых групп (с учетом дочерних групп), в которых есть хотя бы один человек из группы "покупатели".

реально ли (см. тему сообщения) это сделать одним запросом.
...
Рейтинг: 0 / 0
запрос mysql 3.22.21
    #32397885
skol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В такой структуре нереально, если же немного подправить groups, то будет можно.

Т.е. groups переделать как

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE groups (
  id int( 10 ) unsigned NOT NULL auto_increment,
  name varchar( 255 ) NOT NULL default '',
  parent int( 10 ) unsigned NOT NULL default '0',
  num int( 10 ),
  lc int( 10 ),
  rc int( 10 ),
  level int( 10 ),
  PRIMARY KEY (id)
)


тогда

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select distinct g.*
from groups_peoples_rels gpr, groups_peoples_rels gpr2, groups g, groups g2
where gpr.g_id =  /*ID группы 'покупатели'*/ 
and gpr2.p_id = gpr.p_id 
and gpr2.g_id <>  /*ID группы 'покупатели', необязательно*/ 
and g2.g_id = gpr2.g_id
and g.level =  0   /* верхний уровень*/ 
and g2.num between g.lc and g.rc


по поводу lc, rc, level, num полей где то были статьи о представлении деревьев в виде вложенных множеств
...
Рейтинг: 0 / 0
запрос mysql 3.22.21
    #32397895
понятно.

можно ли (опять же одним запросом и в существующей структуре groups, т.е. та, которую я привел) получить самую верхнюю группу для опреедленной группы. то есть для группы

начальники/гады/[так себе]

получить [начальники]
...
Рейтинг: 0 / 0
запрос mysql 3.22.21
    #32397966
skol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем случае нет, но можно заложится на некоторую вложенность, типа

Код: plaintext
1.
2.
3.
4.
5.
select ifnull(gN.id,ifnull(gN- 1 .id,.... ifnull(g3.id,ifnull(g2.id,g1.id)).....))
from groups g1
left join groups g2 on g2.id = g1.parent
left join groups g3 on g3.id = g2.parent
....
where g1.id = ?ID
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / запрос mysql 3.22.21
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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