Как новичок в SQL, я готов выполнять простые задачи, но сейчас я борюсь с несколькими вложенными запросами. Моя проблема заключается в том, что у меня есть 3 таблицы, как это:Вложенные запросы и Join
Case
стол:
id nd date username
--------------------------------------------
1 596 2016-02-09 16:50:03 UserA
2 967 2015-10-09 21:12:23 UserB
3 967 2015-10-09 22:35:40 UserA
4 967 2015-10-09 23:50:31 UserB
5 580 2017-02-09 10:19:43 UserA
Value
стол:
case_id labelValue_id Value Type
-------------------------------------------------
1 3633 2731858342 X
1 124 ["864","862"] X
1 8981 -2.103 X
1 27 443 X
... ... ... ...
2 7890 232478 X
2 765 0.2334 X
... ... ... ...
и Label
стол:
id label
----------------------
3633 Value of W
124 Value of X
8981 Value of Y
27 Value of Z
Очевидно, я хочу присоединиться к этим таблицам эс. Поэтому я могу сделать что-то вроде этого:
SELECT *
from Case, Value, Label
where Case.id= Value.case_id
and Label.id = Value.labelValue_id
но я получаю практически все, в то время как я хотел бы быть более конкретным.
Что я хочу - это сделать некоторую фильтрацию в таблице Case
, а затем использовать полученный идентификатор, чтобы присоединиться к двум другим таблицам. Я хотел бы:
- Профильтруйте
Case.nd
«s такое, что если есть Serveral экземпляры одного и того же го, возьмите самый старый, - Ограничить число й-х в запросе. Например, я хочу, чтобы иметь возможность присоединиться к таблицам всего за 2, 3, 4 и т. Д. ... другой.
- Используйте этот запрос, чтобы сделать соединение на таблице
Value
иLabel
.
Например, выход из запросов 1 и 2 будет:
id nd date username
--------------------------------------------
1 596 2016-02-09 16:50:03 UserA
2 967 2015-10-09 21:12:23 UserB
, если я задам на 2-й различной. Nd 967 появляется несколько раз, но мы берем самую старую.
На самом деле, я думаю, что узнал, как все это делать, но я не могу/не знаю, как их объединить.
Для выбора старейшее й, я могу коснуться как:
select min((date)), nd,id
from Case
group by nd
Затем, чтобы ограничить число й на выходе, я нашел, что это (основано на this и that):
select *,
@num := if(@type <> t.nd, @num + 1, 1) as row_number,
@type := t.nd as dummy
from(
select min((date)), nd,id
from Case
group by nd
) as t
group by t.nd
having row_number <= 2 -- number of output
Это работает, но я чувствую, что он замедляется.
Наконец, когда я пытаюсь сделать соединение с этим подзапросом и двумя другими таблицами, обработка продолжается навсегда.
Во время моих исследований я мог найти ответы на каждую часть проблемы, но я не могу их объединить. Кроме того, для задачи «подсчета», где я хочу ограничить количество nd, я считаю, что это далеко не так.
Я понимаю, что это долгий вопрос, но я думаю, что я что-то пропустил, и я хотел подробно рассказать подробности.
Начните с любой базовой книги или учебника. Особенно обратите внимание на JOINs. – Strawberry