Mysql 嵌套查询和连接
作为SQL的初学者,我可以做一些简单的任务,但我现在正在为多个嵌套查询而挣扎。 我的问题是我有3张这样的表: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
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