【问题标题】:Nested queries and Join嵌套查询和联接
【发布时间】: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 来加入另外两个表。我愿意:

  1. 过滤Case.nd,这样如果有多个相同nd的实例,取最旧的一个,
  2. 限制查询中 nd 的数量。例如,我希望能够加入只有 2、3、4 等...不同 nd 的表格。
  3. 使用此查询对ValueLabel 表进行连接。

例如,查询 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 的数量,我发现了这个(基于thisthat):

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。

标签: mysql join subquery


【解决方案1】:

过滤案例表以消除除最旧的 nds 之外的所有 nds,

select * from [case] c
where date = (Select min(date) from case
              where nd = c.nd)

然后将其加入其他表:

select * from [case] c
   join value v on v.Case_id = c.Id
   join label l on l.Id = v.labelValue_id
where date = (Select min(date) from [case]
              where nd = c.nd)

把它限制在一定数量的记录,有一个mysql特定的命令,我想它叫Limit

select * from [case] c
   join value v on v.Case_id = c.Id
   join label l on l.Id = v.labelValue_id
where date = (Select min(date) from [case]
              where nd = c.nd)
Limit 4 -- <=== will limit return result set to 4 rows

如果您只想要 nd 的前 N ​​个值的记录,那么 Limit 会继续一个子查询,限制要检索的 nd 的哪些值:

select * from [case] c
   join value v on v.Case_id = c.Id
   join label l on l.Id = v.labelValue_id
where date = (Select min(date) from [case]
              where nd = c.nd)
   and nd In (select distinct nd from [case]
              order by nd desc Limit N) 

【讨论】:

  • 谢谢你的回答,加入部分对我有帮助。但是,对于限制部分,我认为还不够清楚。我更新了帖子和Value 表。对于与Case.id 链接的Case.nd,我可以在Value 表中获得5000 个值。所以,我的意思不是限制行数(Limit 4 允许我查看特定 nd 的前 4 个值),而是限制将处理的 nd 的数量。我希望它会有意义。
  • 是的,我明白了,那么您需要对案例表进行另一个谓词限制....但是您必须指定要包含的 哪些 nd 值...假设您想要最高 n 值,我将研究另一种解决方案
  • 谢谢!但是我收到此错误“错误代码:1235。此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'。我使用的是 SQL V5.7.17。但显然,我们可以使用 JOIN IN。我正在努力,我想我已经接近了!
  • 好的,我想我明白了。我只是检查一切。
【解决方案2】:

所以最后,这对我来说很有效:

select *
from (
        select *
        from Case
        join (
            select nd as T_ND, date as T_date
            from Case
            where nd in (select distinct nd from Case)
            group by T_ND Limit 5 -- <========= Limit of nd's
        ) as t
        on Case.nd = t.T_ND
        where date = (select min(date) 
                                from Case
                                where nd = t.T_ND)
    ) as subquery

    join Value 
        on Value.context_id = subquery.id
    join Label
        on Label.id = Value.labelValue_id

感谢@charlesbretana 带领我走上正轨:)。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 2011-04-23
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多