【发布时间】:2017-02-15 15:13:17
【问题描述】:
作为 SQL 的初学者,我可以做一些简单的任务,但我现在在处理多个嵌套查询时遇到了困难。 我的问题是我有 3 个这样的表:
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 表进行一些过滤,然后使用生成的 id 来加入另外两个表。我愿意:
- 过滤
Case.nd,这样如果有多个相同nd的实例,取最旧的一个, - 限制查询中 nd 的数量。例如,我希望能够加入只有 2、3、4 等...不同 nd 的表格。
- 使用此查询对
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。 nd 967 出现了好几次,但我们选择了最旧的一个。
事实上,我想我知道如何做所有这些事情,但我不能/不知道如何合并它们。
要选择最旧的 nd,我可以这样做:
select min((date)), nd,id
from Case
group by nd
然后,为了限制输出中 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的数量,我觉得有点牵强。
我意识到这是一个很长的问题,但我想我错过了一些东西,我想尽可能地提供细节。
【问题讨论】:
-
从任何基础书籍或教程开始。尤其注意 JOIN。