Table 1
ID | NAME | WARD_ID|
1 A 1
2 B 1
3 C 2
4 D 2
Table 2
ID | MONTH1 | MONTH2 | WARD_ID|
1 9 10 1
2 6 11 1
3 5 12 2
4 13 14 2
我想加入这两个表并产生以下输出:
ID | NAME | MONTH1 | MONTH2 | WARD_ID|
1 A 9 10 1
2 B 6 11 1
3 C 5 12 2
4 D 13 14 2
在查询的ON条件中,我必须保持两个表的WARD_ID相等。我无法弄清楚解决方案。任何人都有这样的查询经验吗?
答案 0 :(得分:1)
我想你想要这样的东西:
select t1.*, t2.*
from (select t1.*,
(@rn1 := if(@w1 = ward_id, @rn1 + 1,
if@w1 := ward_id, 1, 1)
)
) as rn
from (select t1.* from table1 t1 order by ward_id, id ) t1 cross join
(select @w1 := -1, @rn1 := -1) params
) t1 join
(select t2.*,
(@rn2 := if(@w2 = ward_id, @rn2 + 1,
if@w2 := ward_id, 1, 1)
)
) as rn
from (select t2.* from table2 t2 order by ward_id, id ) t2 cross join
(select @w2 := -1, @rn1 := -1) params
) t1
on t2.ward_id = t1.ward_id and t2.rn = t1.rn;
子查询枚举每个表中的行。 join
然后使用枚举。
使用row_number()
在MySQL 8.0中更简单。
答案 1 :(得分:0)
我在这里假设ID
在两个表中都是相同的。如果是这样,我认为你可以做多条件加入:
select * from table1 t1
inner join table2 t2
on t1.ID=t2.ID and t1.WARD_ID=t2.WARD_ID
答案 2 :(得分:0)
您可以执行以下操作:
SET @rn:=0;
SET @rn2:=0;
SELECT *
FROM (
SELECT @rn:=@rn+1 AS rn1, t1.ID, t1.NAME, t1.WARD_ID
FROM t1
GROUP BY t1.WARD_ID, t1.NAME
ORDER BY t1.WARD_ID, t1.NAME
) s1
INNER JOIN (
SELECT @rn2:=@rn2+1 AS rn2, t2.ID, t2.MONTH1, t2.MONTH2, t2.WARD_ID
FROM t2
GROUP BY t2.WARD_ID, t2.MONTH1,t2.MONTH2
ORDER BY t2.WARD_ID, t2.MONTH1,t2.MONTH2
) s2 ON s1.WARD_ID = s2.WARD_ID
AND s1.rn1 = s2.rn2
但它确实无法对表进行可靠的排序以便每次都加入相同的行。我仍然认为每次加入两个表都没有可靠/可重复的方法。
=============================================== =============
http://sqlfiddle.com/#!9/aa2db0/1<<<<如果ID
可用于可靠地对两个表进行排序,则可以在ORDER BY
中使用它。我已将其添加到此Fiddle中,并在设置中包含将落在现有记录之前并可能更改排序的行。这还包括Table 2
中的记录多于Table 1
中的记录,因此可能会导致重复的行。这些新行被忽略,因为它们不能在表之间匹配。