Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 嵌套查询和连接_Mysql_Join_Subquery - Fatal编程技术网

Mysql 嵌套查询和连接

Mysql 嵌套查询和连接,mysql,join,subquery,Mysql,Join,Subquery,作为SQL的初学者,我可以做一些简单的任务,但我现在正在为多个嵌套查询而挣扎。 我的问题是我有3张这样的表: SELECT * from Case, Value, Label where Case.id= Value.case_id and Label.id = Value.labelValue_id 案例表: 值表: 和标签表: 显然,我想加入这些表。所以我可以这样做: SELECT * from Case, Value, Label where Case.id= Value.case_id

作为SQL的初学者,我可以做一些简单的任务,但我现在正在为多个嵌套查询而挣扎。 我的问题是我有3张这样的表:

SELECT *
from Case, Value, Label
where Case.id= Value.case_id
and Label.id = Value.labelValue_id
案例表:

值表:

和标签表:

显然,我想加入这些表。所以我可以这样做:

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。 使用此查询对值和标签表进行联接。 例如,查询1和查询2的输出将是:

id   nd    date                  username
--------------------------------------------
1    596   2016-02-09 16:50:03   UserA
2    967   2015-10-09 21:12:23   UserB
如果我要两个不同的nd。ND967出现了好几次,但我们选择了最老的一个

事实上,我想我发现了如何做所有这些事情,但我不知道如何合并它们

要选择最旧的nd,我可以执行以下操作:

select min((date)), nd,id 
    from Case
    group by nd
然后,为了限制输出中nd的数量,我根据和找到了这一点:

它起作用了,但我觉得它越来越慢了

最后,当我尝试与这个子查询和另外两个表进行连接时,处理将永远持续下去

在我的研究过程中,我可以找到问题每个部分的答案,但我不能将它们合并。另外,对于计数问题,我想限制nd的数量,我觉得这有点太离谱了


我意识到这是一个很长的问题,但我想我遗漏了一些东西,我想尽可能多地提供细节。

要过滤案例表以消除除最旧ND以外的所有ND

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 (
        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带领我走上正确的道路。

从任何基础书籍或教程开始。特别是看连接。谢谢你的回答,连接部分帮助了我。然而,对于极限部分,我认为还不够清楚。我更新了post和Value表。对于与Case.id链接的Case.nd,我可以在值表中获得大约5000个值。所以,我的重点不是限制行的数量,限制4允许我查看特定nd的前4个值,而是要处理的nd的数量。我希望它会有意义。是的,我理解,那么您需要对case表进行另一个谓词限制。。。。但您必须指定要包含哪些nd值,然后。。。假设您想要最高的n值,我将检查另一个解决方案谢谢!但是我得到了这个错误代码:1235。这个版本的MySQL还不支持“LIMIT&IN/ALL/ANY/SOME子查询”。我使用的是SQL V5.7.17。但显然,我们可以使用JOIN而不是IN。我正在努力,我想我已经接近了!好的,我想我明白了。我只是检查一切。
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)
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
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) 
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