Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Совет по JOIN / 25 сообщений из 28, страница 1 из 2
15.01.2020, 11:43
    #39914187
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Имеется такой запрос (упрощенный для примера):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
  c.id,
  d.h_sum_debt+d.hw_sum_debt dhhw,
  n.date_from ndf,n.debt_total,
  cl.date_from cldf,cl.debt_sum_h+cl.debt_sum_hw cldebt,
  t.date_from tdf,t.debt_sum_h+t.debt_sum_hw tdebt
FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
LEFT JOIN notifications n ON c.id=n.id_contragent AND n.period<=d.period
LEFT JOIN claims cl ON c.id=cl.id_contragent AND cl.period<=d.period
LEFT JOIN test t ON c.id=t.id_contragent AND t.period<=d.period
WHERE m.id=152 AND d.period='2019-12-01'
ORDER BY c.id


Задача: выбрать по каждому контрагенту ( c.id ) в доме ( mkd ) некоторую информацию из data_sgrc , присовокупив к выборке данные еще из нескольких таблиц по контрагенту. Все работает хорошо до тех пор, пока в таблице test не появилось несколько записей на одного контрагента и их все надо выбрать. Получается вот так:


Т.е. дублирование данных на каждую добавленную запись из test . Как можно этого избежать? Т.е. чтобы вместо данных в красной рамке было Null.
Дополнительно: в таблице notifications всегда только одна запись на контрагента, но в claims также может быть несколько записей на одного контрагента (в примере - одна).
...
Рейтинг: 0 / 0
15.01.2020, 11:57
    #39914196
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
LiYing,

Сгруппировать данные в test у тебя будет одна запись на 1 c.id

А вообще всё плохо, я только запрос увидел и уже захотелось выпить. Присовокупляй данные как-нибудь отдельно, а не всё в одной куче. Раньше я делал такое с помошью inmemory таблицы и update, а сейчас делаю на промежуточном слое. Волосы стали мягкими и шелковистыми, бросил пить, вернулась жена.
...
Рейтинг: 0 / 0
15.01.2020, 13:08
    #39914255
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
crutchmaster
Сгруппировать данные в test у тебя будет одна запись на 1 c.id

Нужно как раз 4 записи из test (на c.id=9884) и столько, сколько есть из notifications , claims .
...
Рейтинг: 0 / 0
15.01.2020, 15:31
    #39914382
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Если дублирующиеся данные из первых двух столбцов нельзя за-null-ить, то может это можно сделать хотя бы для дубликатов из notifications , claims ?
Чтобы стало так:
...
Рейтинг: 0 / 0
15.01.2020, 15:34
    #39914384
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Версию MySQL принципиально не указываем? а зря - на ЭТОЙ задаче версия не просто важна, а критична.
А так - да, решаемо.
...
Рейтинг: 0 / 0
15.01.2020, 15:41
    #39914386
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina,

Извиняюсь, упустил сей момент. Версия 8.0.13
...
Рейтинг: 0 / 0
15.01.2020, 15:45
    #39914389
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Если точно так же упрощённо - то

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT c.id,
       CASE WHEN @id != c.id THEN d.fields END,
       CASE WHEN @id != c.id THEN c.fields END,
       CASE WHEN @id != c.id THEN m.fields END,
       CASE WHEN @id != c.id THEN n.fields END,
       CASE WHEN @id != c.id THEN cl.fields END,
       CASE WHEN @id := c.id THEN t.fields END
FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
LEFT JOIN notifications n ON c.id=n.id_contragent AND n.period<=d.period
LEFT JOIN claims cl ON c.id=cl.id_contragent AND cl.period<=d.period
LEFT JOIN test t ON c.id=t.id_contragent AND t.period<=d.period
WHERE m.id=152 
  AND d.period='2019-12-01'
  AND (@id := -1)
ORDER BY c.id


c.id я всё же оставил. И думаю, что его не надо удалять хотя бы для контроля.
...
Рейтинг: 0 / 0
15.01.2020, 15:58
    #39914400
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
LiYing
Версия 8.0.13


Тогда можно не использовать переменные:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT c.id,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE d.fields END,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE c.fields END,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE m.fields END,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE n.fields END,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE cl.fields END,
       t.fields
FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
LEFT JOIN notifications n ON c.id=n.id_contragent AND n.period<=d.period
LEFT JOIN claims cl ON c.id=cl.id_contragent AND cl.period<=d.period
LEFT JOIN test t ON c.id=t.id_contragent AND t.period<=d.period
WHERE m.id=152 
  AND d.period='2019-12-01'
ORDER BY c.id
...
Рейтинг: 0 / 0
15.01.2020, 16:13
    #39914410
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina,

Оба варианта работают как хотелось, спасибо!
Записал так пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT c.id,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE d.h_sum_debt+d.hw_sum_debt END dhhw,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE n.date_from END ndf,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE n.debt_total END debt_total,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE cl.date_from END cldf,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE cl.debt_sum_h+cl.debt_sum_hw END cldebt,
       t.date_from tdf,t.debt_sum_h+t.debt_sum_hw tdebt
FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
LEFT JOIN notifications n ON c.id=n.id_contragent AND n.period<=d.period
LEFT JOIN claims cl ON c.id=cl.id_contragent AND cl.period<=d.period
LEFT JOIN test t ON c.id=t.id_contragent AND t.period<=d.period
WHERE m.id=152 
  AND d.period='2019-12-01'
ORDER BY c.id



Я правильно понимаю, что если в claims будет несколько записей на одного контрагента, а в test одна или ни одной, то и
Код: sql
1.
t.date_from tdf,t.debt_sum_h+t.debt_sum_hw tdebt

в селекте нужно обернуть в CASE?
...
Рейтинг: 0 / 0
16.01.2020, 07:45
    #39914627
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
В CASE НЕ оборачиваются все выражения, в которых присутствует хотя бы одно поле из таблицы, в которой есть дубликаты. Все остальные - в выражениях которых есть только поля из таблиц с гарантированно одной записью,- оборачиваются в CASE, за исключением одного идентифицирующего поля.
...
Рейтинг: 0 / 0
16.01.2020, 08:29
    #39914636
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina,

Понял, спасибо!
...
Рейтинг: 0 / 0
16.01.2020, 10:17
    #39914674
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Что-то не так получается... Добавил в запрос тестовую таблицу testx , теперь на одного контрагента c.id=9884 приходится 1 запись из notifications , 3 записи из testx и 4 записи из test :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT c.id,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE d.h_sum_debt+d.hw_sum_debt END dhhw,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE n.date_from END n_df,
       CASE WHEN c.id = LAG(c.id) OVER () THEN NULL ELSE n.debt_total END n_debt,
       x.date_from x_df,x.debt_sum_h+x.debt_sum_hw x_debt,
       t.date_from t_df,t.debt_sum_h+t.debt_sum_hw t_debt
FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
LEFT JOIN notifications n ON c.id=n.id_contragent AND n.period<=d.period
LEFT JOIN testx x ON c.id=x.id_contragent AND x.period<=d.period
LEFT JOIN test t ON c.id=t.id_contragent AND t.period<=d.period
WHERE m.id=152 
  AND d.period='2019-12-01'
ORDER BY c.id


Получается такой результат:


Появился мультипликативный эффект: 3*4=12 строк на c.id=9884 вместо требуемых четырех. Что делать? :)
...
Рейтинг: 0 / 0
16.01.2020, 11:45
    #39914734
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
LiYing
Что делать?
Для каждого поля дополнительно сравнивать значение текущей и предыдущей записи, и заменять на NULL, если ни значение, ни идентификатор не изменились. Типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CASE WHEN     c.id = LAG(c.id) OVER () 
          AND d.h_sum_debt = LAG(d.h_sum_debt) OVER () 
          AND d.hw_sum_debt = LAG(d.hw_sum_debt) OVER () 
     THEN NULL 
     ELSE d.h_sum_debt+d.hw_sum_debt 
     END dhhw,
CASE WHEN     c.id = LAG(c.id) OVER () 
          AND n.date_from = LAG(n.date_from) OVER () 
     THEN NULL ELSE n.date_from END ndf,
...
Рейтинг: 0 / 0
16.01.2020, 13:43
    #39914790
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina,

Нет, не выходит, как только не мучил...
Если так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT c.id,
       CASE WHEN c.id = LAG(c.id) OVER () AND d.h_sum_debt = LAG(d.h_sum_debt) OVER () AND d.hw_sum_debt = LAG(d.hw_sum_debt) OVER () THEN NULL ELSE d.h_sum_debt+d.hw_sum_debt END dhhw,
       CASE WHEN c.id = LAG(c.id) OVER () AND n.date_from = LAG(n.date_from) OVER () THEN NULL ELSE n.date_from END n_df,
       CASE WHEN c.id = LAG(c.id) OVER () AND n.debt_total = LAG(n.debt_total) OVER () THEN NULL ELSE n.debt_total END n_debt,
       x.date_from x_df,x.debt_sum_h+x.debt_sum_hw x_debt,
       t.date_from t_df,t.debt_sum_h+t.debt_sum_hw t_debt
FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
LEFT JOIN notifications n ON c.id=n.id_contragent AND n.period<=d.period
LEFT JOIN testx x ON c.id=x.id_contragent AND x.period<=d.period
LEFT JOIN test t ON c.id=t.id_contragent AND t.period<=d.period
WHERE m.id=152 
  AND d.period='2019-12-01'
ORDER BY c.id


то результат такой же как и выше:


А если же все завернуть в CASE
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT c.id,
       CASE WHEN c.id = LAG(c.id) OVER () AND d.h_sum_debt = LAG(d.h_sum_debt) OVER () AND d.hw_sum_debt = LAG(d.hw_sum_debt) OVER () THEN NULL ELSE d.h_sum_debt+d.hw_sum_debt END dhhw,
       CASE WHEN c.id = LAG(c.id) OVER () AND n.date_from = LAG(n.date_from) OVER () THEN NULL ELSE n.date_from END n_df,
       CASE WHEN c.id = LAG(c.id) OVER () AND n.debt_total = LAG(n.debt_total) OVER () THEN NULL ELSE n.debt_total END n_debt,
       CASE WHEN c.id = LAG(c.id) OVER () AND x.date_from = LAG(x.date_from) OVER () THEN NULL ELSE x.date_from END x_df,	
       CASE WHEN c.id = LAG(c.id) OVER () AND x.debt_sum_h = LAG(x.debt_sum_h) OVER () AND x.debt_sum_hw = LAG(x.debt_sum_hw) OVER () THEN NULL ELSE x.debt_sum_h+x.debt_sum_hw END x_debt,
       CASE WHEN c.id = LAG(c.id) OVER () AND t.date_from = LAG(t.date_from) OVER () THEN NULL ELSE t.date_from END t_df,
       CASE WHEN c.id = LAG(c.id) OVER () AND t.debt_sum_h = LAG(t.debt_sum_h) OVER () AND t.debt_sum_hw = LAG(t.debt_sum_hw) OVER () THEN NULL ELSE t.debt_sum_h+t.debt_sum_hw END t_debt
FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
LEFT JOIN notifications n ON c.id=n.id_contragent AND n.period<=d.period
LEFT JOIN testx x ON c.id=x.id_contragent AND x.period<=d.period
LEFT JOIN test t ON c.id=t.id_contragent AND t.period<=d.period
WHERE m.id=152 
  AND d.period='2019-12-01'
ORDER BY c.id


то опять не то:


Еще варианты?
...
Рейтинг: 0 / 0
16.01.2020, 15:19
    #39914851
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
LiYing
Еще варианты?
Создайте адекватную модельную fiddle - и будем на ней играться.
...
Рейтинг: 0 / 0
16.01.2020, 16:43
    #39914902
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina,

Создал fiddle , немного упростив.
Хочется видеть для c.id=9884 четыре строки (а не 12 как получается), как нафотошопил тут:
...
Рейтинг: 0 / 0
16.01.2020, 20:10
    #39915022
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Эээ... это будет совсем другая технология! это ни разу не джойн в лоб, как у тебя.

Получается вот такой монстр:

Код: sql
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.
WITH RECURSIVE
cte_d AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY id_contragent
                                         ORDER BY period ) rn 
           FROM data
           WHERE period = '2019-12-01'),
cte_n AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY id_contragent
                                         ORDER BY period ) rn
           FROM notifications 
           WHERE period <= '2019-12-01'),
cte_x AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY id_contragent
                                         ORDER BY date_from ) rn
           FROM testx 
           WHERE period <= '2019-12-01'),
cte_t AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY id_contragent
                                         ORDER BY date_from ) rn 
           FROM test 
           WHERE period <= '2019-12-01'),
cte_1 AS ( SELECT id_contragent, rn FROM cte_d
           UNION ALL
           SELECT id_contragent, rn FROM cte_n
           UNION ALL
           SELECT id_contragent, rn FROM cte_x
           UNION ALL
           SELECT id_contragent, rn FROM cte_t ),
cte_2 AS ( SELECT id_contragent, MAX(rn) rn
           FROM cte_1
           GROUP BY id_contragent ),
cte_c AS ( SELECT id, 1 rn
           FROM contragents 
           UNION ALL
           SELECT id, cte_c.rn+1
           FROM cte_c, cte_2
           WHERE cte_c.id = cte_2.id_contragent
             AND cte_c.rn < cte_2.rn)
SELECT c.rn, c.id,
       d.h+d.hw dhhw,
       n.date_from n_df,
       n.debt n_debt,
       x.date_from x_df,
       x.debt_sum_h+x.debt_sum_hw x_debt,
       t.date_from t_df,
       t.debt_sum_h+t.debt_sum_hw t_debt
FROM cte_c c 
LEFT JOIN cte_d d ON c.rn=d.rn AND d.id_contragent=c.id 
LEFT JOIN cte_n n ON c.rn=n.rn AND c.id=n.id_contragent
LEFT JOIN cte_x x ON c.rn=x.rn AND c.id=x.id_contragent
LEFT JOIN cte_t t ON c.rn=t.rn AND c.id=t.id_contragent
ORDER BY c.id, c.rn;


fiddle
Впрочем, если разобраться, что делает каждая отдельная CTE, то всё довольно просто.
...
Рейтинг: 0 / 0
16.01.2020, 20:38
    #39915032
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina,


Чую, завтра весь день уйдет на понимание, спасибо :)
А учитывая, что это был нормально так упрощенный от реального пример, иэххх!...
...
Рейтинг: 0 / 0
16.01.2020, 20:53
    #39915037
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
LiYing
завтра весь день уйдет на понимание
Да ну, фигня... разве что cte_1 - но рассматривай его в комплексе с cte_2.

Главная во всём тонкость - перенос отборов в CTE, который нужно делать достаточно аккуратно.
...
Рейтинг: 0 / 0
17.01.2020, 09:53
    #39915202
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina,

Для кого фигня, а для кого и "шарики за ролики" :)
Пытаюсь разобраться в запросе, так вроде по раздельности эти CTE понятны, но есть вопросы :)
1) почему в cte_n используется ORDER BY period, а не ORDER BY date_from ? Опечатка?
2) в текущем виде выборка по всем контрагентам за период, а не соображу как теперь сделать выборку по контрагентам в заданном МКД (m.id=152) за период? Т.е. то, что в моем запросе в первом посте записано как
Код: sql
1.
2.
3.
4.
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
...
WHERE m.id=152 AND d.period='2019-12-01'


Куда это условие вставлять?
Добавил в fiddle табличку `mkd`
...
Рейтинг: 0 / 0
17.01.2020, 12:08
    #39915342
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
LiYing
почему в cte_n используется ORDER BY period, а не ORDER BY date_from ?
Потому что это не было определено. Пришлось придумывать на основании исходных данных.

LiYing
как теперь сделать выборку по контрагентам в заданном МКД (m.id=152)
А просто добавить AND c.id_mkd = 152 в финальный запрос - не устраивает?

К тому же у тебя все контрагенты имеют этот МКД - так что на этих данных ты разницу не увидишь.
...
Рейтинг: 0 / 0
17.01.2020, 13:05
    #39915403
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Akina
А просто добавить AND c.id_mkd = 152 в финальный запрос - не устраивает?

Оно бы устраивало, если бы работало :)
Я чуть изменил в fiddle запрос cte_c и финальный, но споткнулся на ошибке "The used SELECT statements have a different number of columns", т.к. не могу добавить id_mkd в cte_2 из-за того, что используемые в cte_1 CTE ничего не знают о таблице mkd . Запутался вконец...

AkinaК тому же у тебя все контрагенты имеют этот МКД - так что на этих данных ты разницу не увидишь.
Ну пример просто краткий, не стал сотни записей добавлять, чтобы не загромождать фиддл. Ну предположим, там несколько сотен записей, а не 3. И на каждый id_mkd имеется по сотне контрагентов c.id. Как тогда?
...
Рейтинг: 0 / 0
17.01.2020, 14:28
    #39915464
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
LiYing
не могу добавить id_mkd в cte_2 из-за того, что используемые в cte_1 CTE ничего не знают о таблице mkd
А нафига они там?
...
Рейтинг: 0 / 0
17.01.2020, 15:07
    #39915492
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
AkinaА нафига они там?
Может и не нафига, но как тогда или устранить ошибку в последнем фиддле или изменить его так, чтобы выбирать данные только по контрагентам из одного заданного МКД? Посмотрите фиддл, плиз.
...
Рейтинг: 0 / 0
17.01.2020, 16:53
    #39915550
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Совет по JOIN
Вроде разобрался как выбрать контрагентов только из нужного МКД, добавил WHERE id_mkd=152, благо больше никакие данные из таблицы mkd не нужны:
Код: sql
1.
2.
3.
4.
5.
6.
cte_c AS ( SELECT id, 1 rn
           FROM contragents WHERE id_mkd=152
           UNION ALL
           SELECT id, cte_c.rn+1
           FROM cte_c, cte_2
           WHERE cte_c.id = cte_2.id_contragent AND cte_c.rn < cte_2.rn)


Норм решение?
Но тут другая бяда выяснилась :) Отбираются все контрагенты по МКД, но нужно только тех, кто присутствует в таблице data в указанный период. С этим-то как быть?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Совет по JOIN / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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