使用连接和组更新计数

时间:2016-06-09 21:27:32

标签: mysql join updates

我可以根据第二个表中的计数在表之间进行更新,如下所示:

Update TableJ J
Inner Join (Select B_ID,C,S from TableC group by C,S having count=1) C
On J.C=C.C and J.S=C.S
Set T1.B_ID=T2.B_ID

问题是我的TableC不包含S,它存储在另一个表中,并通过B调用它Table_BS(请不要开玩笑:|)。如果我不必担心计数,那么我可以这样做:

Update TableJ J
Inner Join TableC C
Inner Join TableBS BS
On J.C=C.C and C.S=BS.S
Set J.B_ID=BS.B_ID

除了问题之外,与原始计数一样,我只想在B_ID中只有一条C条记录S的{​​{1}}记录时返回TableBS

更新: 那么这就是我已经走了多远(选择明智):

Select J.ID,B.B_ID
From DBJ J Inner Join LBS B Inner Join  C 
On J.C=C.C And (
J.S_ID = B.S_ID 
or J.S_ID=B.CS_ID) 
and B.B_ID=C.B_ID

在我的情况下,返回三条记录:

+----+------+
| ID | B_ID |
+----+------+
| 88 | 100  |
+----+------+
| 90 | 200  |
+----+------+
| 90 | 200  |
+----+------+

ID是我想要更新的记录,B_ID是我想要更新的值。在这种情况下,事实证明我试图限制的计数是输出中的ID列,换句话说我只想更新TableJ,记录88的值为100. TableJ记录90结果是> 1结果所以我想跳过它。只是不确定将group bycount放在何处。

更新:不确定为什么这个解决方案仍然在我的掌握之外,虽然越来越近,我可以让select现在返回要更新的记录的ID,并且只更新那些带有一个结果的记录更新的值如下:

Select J.ID,B.B_ID
From DBJ J Inner Join LBS B Inner Join  C 
On J.C=C.C And (
J.S_ID = B.S_ID 
or J.S_ID=B.CS_ID) 
and B.B_ID=C.B_ID group by J.ID having count(*)=1

返回

+----+------+
| ID | B_ID |
+----+------+
| 88 | 100  |
+----+------+

现在仍然无法使用值100来更新TableJ记录88字段B_ID。

2 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了这个问题,但这是我的解决方案

Update TableJ J 
Inner Join (
 Select B_ID,TableC.C, TableBS.S 
 from TableC Inner Join TableBS
 on TableC.B= TableBS.B 
 group by TableC.C,TableBS.S 
 having count(*)=1
) C 
On J.C=C.C 
Set J.B_ID=C.B_ID

答案 1 :(得分:0)

到目前为止,这似乎已经成功了:

Update TableJ T1
Inner Join
(Select J.ID,B.B_ID
From TableJ J Inner Join TableBS B Inner Join  TableC C
On J.C=C.C 
And J.S = B.S
And B.B_ID=C.B_ID 
group by J.ID having count(*)=1)  T2
On T1.ID=T2.ID Set T1.B_ID=T2.B_ID

基本上首先使用select返回Update TableJ的ID和TableBS中的B_ID,其中TableC中的C与TableJ中的C匹配,TableBS中的S与TableJ中的S匹配。我根据TableJ中的ID对结果进行了计数,这样我只有在得到一个结果时才返回值。