Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как сделать запрос? / 10 сообщений из 10, страница 1 из 1
04.05.2016, 22:04
    #39229479
vartadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как сделать запрос?
Здравствуйте!

Есть следующие таблицы:
таблица t1 с полем
id1 - первичный ключ
таблица t2 с полем
id2 - первичный ключ
таблица t3, которая организует связь многие ко многим для приведенных выше таблиц, с полями
id1_3,id2_3
И есть список (таблица t4) с полем id1_4 все элементы которого являются подмножеством таблицы t1.

Вопрос №1: Как выбрать только те строки t2 у которых ВСЕ соответствующие элементы id1_3 (через таблицу t3) входят в таблицу t4.
Вопрос №2: То же что и выше, но в таблицу t4 не входят 1,2,3 и т.д. элементов.
...
Рейтинг: 0 / 0
04.05.2016, 22:52
    #39229492
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как сделать запрос?
vartadanКак выбрать только те строки t2 у которых ВСЕ соответствующие элементы id1_3 (через таблицу t3) входят в таблицу t4.
После соответствующего связывания сгруппировать по t2 и убедиться, что count-ы по t3 и t4 равны.

vartadanТо же что и выше, но в таблицу t4 не входят 1,2,3 и т.д. элементов.
Ну а тут разность посчитать.
...
Рейтинг: 0 / 0
05.05.2016, 21:41
    #39230379
vartadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как сделать запрос?
Akina,
Получилось что-то вроде этого

SELECT (select count(*) from t4),COUNT(t2.id2), t2.id2
FROM t4 left join t3
on t4.id1_4=t3.id1_3 left join t2 on t3.id2_3=t2.id2
group by t2.id2

Результат получился такой
(select count(*) from t4)|COUNT(t2.id2)|t2.id2
84|15|2072
84|15|9275
84|14|8800

но для ответа на вопрос №1 нужно в вышеуказанный запрос добавить что-то типа

select count(*) from t3 where t3.id2_3='2072'

а как это сделать подскажите, пожалуйста
...
Рейтинг: 0 / 0
06.05.2016, 09:54
    #39230555
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как сделать запрос?
vartadanПолучилось что-то вроде этого
Близко не лежало.

Выкладывайте (под спойлер с теге SRC) протестированные (!!!) запросы формирования структуры и наполнения таблиц и показывайте желаемый на этих данных результат.
...
Рейтинг: 0 / 0
06.05.2016, 18:02
    #39231058
vartadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как сделать запрос?
Код: 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.
CREATE TABLE  t1(id1 BIGINT( 20 ) NOT NULL);
CREATE TABLE  t2(id2 BIGINT( 20 ) NOT NULL);
CREATE TABLE  t3(id2_3 BIGINT( 20 ) NOT NULL,id1_3 BIGINT( 20 ) NOT NULL);
CREATE TABLE  t4(id1_4 BIGINT( 20 ) NOT NULL);

insert into t1 (id1) value (1);
insert into t1 (id1) value (2);
insert into t1 (id1) value (3);
insert into t1 (id1) value (4);
insert into t1 (id1) value (5);
insert into t1 (id1) value (6);
insert into t1 (id1) value (7);
insert into t1 (id1) value (8);
insert into t1 (id1) value (9);
insert into t1 (id1) value (10);

insert into t2 (id2) value (1);
insert into t2 (id2) value (2);
insert into t2 (id2) value (3);
insert into t2 (id2) value (4);
insert into t2 (id2) value (5);

insert into t3 (id2_3,id1_3) value (1,2);
insert into t3 (id2_3,id1_3) value (1,5);
insert into t3 (id2_3,id1_3) value (1,10);
insert into t3 (id2_3,id1_3) value (1,6);
insert into t3 (id2_3,id1_3) value (2,5);
insert into t3 (id2_3,id1_3) value (2,8);
insert into t3 (id2_3,id1_3) value (2,9);
insert into t3 (id2_3,id1_3) value (3,1);
insert into t3 (id2_3,id1_3) value (3,4);
insert into t3 (id2_3,id1_3) value (4,4);
insert into t3 (id2_3,id1_3) value (4,5);
insert into t3 (id2_3,id1_3) value (4,3);
insert into t3 (id2_3,id1_3) value (4,7);
insert into t3 (id2_3,id1_3) value (4,1);
insert into t3 (id2_3,id1_3) value (5,6);
insert into t3 (id2_3,id1_3) value (5,7);

insert into t4 (id1_4) value (4);
insert into t4 (id1_4) value (5);
insert into t4 (id1_4) value (3);
insert into t4 (id1_4) value (1);



Ответ:
на вопрос №1
id2
3

на вопрос №2
id2|col
4|1
2|2
1|3
...
Рейтинг: 0 / 0
06.05.2016, 20:17
    #39231104
как сделать запрос?
на вопрос №1:
Код: sql
1.
2.
3.
4.
5.
select t2.* from t2
 left join t3 ON t2.id2 = t3.id2_3
 left join t4 ON t3.id1_3 = t4.id1_4
group by t2.id2
having max(if(t4.id1_4 is null, 1, 0)) = 0;



на вопрос №2 - не понятно что значит: " не входят 1,2,3 и т.д. элементов ".
...
Рейтинг: 0 / 0
06.05.2016, 20:31
    #39231110
как сделать запрос?
на вопрос №2 (если я правильно догадался):
Код: sql
1.
2.
3.
4.
5.
6.
select t2.*, sum(if(t4.id1_4 is null, 1, 0)) as c
 from t2
 left join t3 ON t2.id2 = t3.id2_3
 left join t4 ON t3.id1_3 = t4.id1_4
group by t2.id2
having c between 1 and 3  AND  min(if(t4.id1_4 is null, 1, 0)) = 0;
...
Рейтинг: 0 / 0
06.05.2016, 20:34
    #39231111
vartadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как сделать запрос?
Громыхатель,
Это значит что 1,2 или 3 элемента из множества типа (select id1_3 from t3 where t3.id2_3=X) не входит во множество t4
...
Рейтинг: 0 / 0
13.05.2016, 23:27
    #39235634
vartadan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как сделать запрос?
Тестирую на Денвере, в таблице t1 - 760 записей, t2 - 5000 записей, t3 - 230000 записей, t4 - 80 записей. После десяти минут выполнения запроса никакого ответа так и не получил - надоело ждать, завершил процесс. Вопрос - это денвер такой медленный или количество записей действительно слишком большое? Как можно ускорить выполнение запроса?
...
Рейтинг: 0 / 0
14.05.2016, 03:57
    #39235674
как сделать запрос?
Значит индексы отсутствуют. Сделайте Explain долгих запросов.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как сделать запрос? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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