在 1 中混合 3 个 sql 查询
Posted
技术标签:
【中文标题】在 1 中混合 3 个 sql 查询【英文标题】:Mixing 3 sql queries in 1 【发布时间】:2016-01-13 22:41:34 【问题描述】:我有3张桌子如下
表1
Id Name
1 abcd
2 bcd
3 dabc
表2
Id2 Name2
2 xyz
3 def
4 mno
表3
Id Id2 Value
1 4 1
2 3 1
3 4 1
现在,
从 table1 :我必须选择 Name 为 %abc% 的所有 Id 从 table2:我必须选择 Id2,其中 Name2 是“mno” 来自 Table3:我必须将值从 1 更改为 0,其中 Id 的值来自 Table1,Id2 来自 Table2。
表 1:
select Id from Table1 where Name like '%abc%'
表2:
select Id2 from Table2 where Name2 = "mno"
表 3:
update Table3 set Value = 0 where Id in() and Id2=
但是,我不知道如何使它成为 1 个单一查询。有人可以指导我吗?
【问题讨论】:
您应该查看连接查询"dev.mysql.com/doc/refman/5.7/en/join.html" 在此处加入漂亮的视觉辅助:blog.codinghorror.com/a-visual-explanation-of-sql-joins 【参考方案1】:参考:prior stack article
你还没有解释 T1 与 T2 的关系,所以我假设了一个交叉连接。
每当您在 T1 中的数据中有名称为 '%abc%' (1,3) 的记录时.. 并且每当您在 T2 中有一条名称等于 'mno' 4 的记录时,您希望表 3 中的值为 0
所以我们生成的选择应该产生 1,4 3,4
当我们将其内部连接回表 3 时,它只选择
Id Id2 Value
1 4 1
3 4 1
现在我们根据上面提供的链接中概述的此选择生成更新...
UPDATE table3
INNER JOIN (
SSELECT t1.ID t1ID, t2.id t2ID
FROM table1 t1
CROSS JOIN table2
WHERE t1.name like '%abc%'
and t2.name like = 'mno') B
on B.t1ID = t3.Id
and B.t2ID = T3.ID2
SET value = 0
给我们一个结果
Id Id2 Value
1 4 0
2 3 1
3 4 0
if we select * from table3
【讨论】:
【参考方案2】:update t3
set t3.Value = 0
from Table3 t3
inner join Table1 t1
on t3.Id = t1.Id
inner join Table2 t2
on t3.Id2 = t2.Id2
where t1.Name like '%abc%' and t2.Name2 = 'mno'
或
update Table3
set value = 0
where Id in (select Id from Table1 where Name like '%abc%')
and Id2 in (select Id2 from Table2 where Name2 = 'mno')
【讨论】:
注意,尽量避免使用 IN 子查询,而使用 EXISTS。参考:explainextended.com/2010/05/27/…谢谢 并非如此。阅读优化器dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html 的子查询优化【参考方案3】:您应该考虑 UPDATE ... WHERE EXISTS 如下:
update Table3 set Value = 0
WHERE EXISTS (SELECT 1 FROM Table1 where Name LIKE '%abc%' AND Table1.Id=Table3.Id )
AND EXISTS (SELECT 1 FROM Table2 where Name2 = "mno" AND Table2.Id2=Table3.Id2)
【讨论】:
以上是关于在 1 中混合 3 个 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel Eloquent 和命名绑定的 SQL 查询:混合命名参数和位置参数
用dataframe重写sql查询;如何从选择中混合不同的来源