使用两个选择和连接进行查询
Query with two selects and joins
需要帮助来形成具有两个选择和连接的查询。我在同一信息中搜索重复条目,但该信息位于两个表中。
Table ordermeta 有orderid 和formid。
Table 订单有 orderid 和 userid
我两次将 ordermeta 加入订单,然后搜索 formid 和 userid 匹配的不同 orderids。
这是我尝试过的:
SELECT om0.orderid AS order1, om1.orderid AS order2
FROM ordermeta om0
LEFT JOIN ordermeta om1 ON om0.formid = om0.formid
LEFT JOIN orders o0 ON om0.orderid = o0.orderid
LEFT JOIN orders o1 ON om1.orderid = o1.orderid
WHERE o0.userid = o1.userid
AND om0.orderid != om1.orderid
我也试过这个但是完全混淆并移动到上面的代码:
SELECT order1.oid1, order1.pd1, order2.oid2, order2.pd2
FROM (
SELECT o1.orderid AS oid1, paid AS pd1, uid AS uid1, fid AS fid1
FROM `orders` o1
JOIN ordermeta om1 ON o1.orderid = om1.orderid
) order1
JOIN (
SELECT o2.orderid AS oid2, paid AS pd2, uid AS uid2, fid AS fid2
FROM `orders` o2
JOIN ordermeta om2 ON o2.orderid = om2.orderid
) order2 ON order1.uid1 = order2.uid2 AND order1.fid1 = order2.fid2
我得到的结果比我预期的要多。应该在 1000 的数量级,但我已经超过 223000。
示例数据:
ordermeta table
HEADER: omid, orderid, formid, <other data>
1, 101, 201, ...
2, 102, 202, ...
3, 103, 201, ...
4, 108, 201, ...
5, 109, 202, ...
orders table
HEADER: orderid, userid, <other data>
101, 2000, ...
102, 2000, ...
103, 2001, ...
108, 2000, ...
109, 2001, ...
首先,我需要将userid关联到结合formid的ordermeta。然后,在组合数据中搜索重复项,其中 formid=formid 和 userid=userid 以及 return 两个 orderids。
在上面的示例中,我应该得到 orderids 101 和 108,因为它们的 userids 和 formids 在加入后是匹配的。
你的逻辑非常接近:
select *
from ordermeta om1
inner join
orders o1
on om1.orderid = o1.orderid
inner join
ordermeta om2
on om1.formid = om2.formid
inner join
orders o2
on om2.orderid = o2.orderid
where o1.userid = o2.userid
and o1.orderid <> o2.orderid
演示 fiddle 此处:http://sqlfiddle.com/#!9/b0936/1
事实上,如果您没有为两个 ordermeta
表
输入错误的连接谓词,您的原始查询就没问题
您的问题出在第一个连接条件:
LEFT JOIN ordermeta om1 ON om0.formid = om0.formid
显然是一个错字,但 om0.formid = om0.formid
总是正确的。将其更改为:
LEFT JOIN ordermeta om1 ON om0.formid = om1.formid
您也应该将条件 int he qhere 子句移动到连接子句中,因此整个查询如下所示:
SELECT om0.orderid AS order1, om1.orderid AS order2
FROM ordermeta om0
LEFT JOIN ordermeta om1 ON om0.formid = om0.formid
AND om0.orderid != om1.orderid
LEFT JOIN orders o0 ON om0.orderid = o0.orderid
LEFT JOIN orders o1 ON om1.orderid = o1.orderid
AND o0.userid = o1.userid
需要帮助来形成具有两个选择和连接的查询。我在同一信息中搜索重复条目,但该信息位于两个表中。
Table ordermeta 有orderid 和formid。 Table 订单有 orderid 和 userid
我两次将 ordermeta 加入订单,然后搜索 formid 和 userid 匹配的不同 orderids。
这是我尝试过的:
SELECT om0.orderid AS order1, om1.orderid AS order2
FROM ordermeta om0
LEFT JOIN ordermeta om1 ON om0.formid = om0.formid
LEFT JOIN orders o0 ON om0.orderid = o0.orderid
LEFT JOIN orders o1 ON om1.orderid = o1.orderid
WHERE o0.userid = o1.userid
AND om0.orderid != om1.orderid
我也试过这个但是完全混淆并移动到上面的代码:
SELECT order1.oid1, order1.pd1, order2.oid2, order2.pd2
FROM (
SELECT o1.orderid AS oid1, paid AS pd1, uid AS uid1, fid AS fid1
FROM `orders` o1
JOIN ordermeta om1 ON o1.orderid = om1.orderid
) order1
JOIN (
SELECT o2.orderid AS oid2, paid AS pd2, uid AS uid2, fid AS fid2
FROM `orders` o2
JOIN ordermeta om2 ON o2.orderid = om2.orderid
) order2 ON order1.uid1 = order2.uid2 AND order1.fid1 = order2.fid2
我得到的结果比我预期的要多。应该在 1000 的数量级,但我已经超过 223000。
示例数据:
ordermeta table
HEADER: omid, orderid, formid, <other data>
1, 101, 201, ...
2, 102, 202, ...
3, 103, 201, ...
4, 108, 201, ...
5, 109, 202, ...
orders table
HEADER: orderid, userid, <other data>
101, 2000, ...
102, 2000, ...
103, 2001, ...
108, 2000, ...
109, 2001, ...
首先,我需要将userid关联到结合formid的ordermeta。然后,在组合数据中搜索重复项,其中 formid=formid 和 userid=userid 以及 return 两个 orderids。
在上面的示例中,我应该得到 orderids 101 和 108,因为它们的 userids 和 formids 在加入后是匹配的。
你的逻辑非常接近:
select *
from ordermeta om1
inner join
orders o1
on om1.orderid = o1.orderid
inner join
ordermeta om2
on om1.formid = om2.formid
inner join
orders o2
on om2.orderid = o2.orderid
where o1.userid = o2.userid
and o1.orderid <> o2.orderid
演示 fiddle 此处:http://sqlfiddle.com/#!9/b0936/1
事实上,如果您没有为两个 ordermeta
表
您的问题出在第一个连接条件:
LEFT JOIN ordermeta om1 ON om0.formid = om0.formid
显然是一个错字,但 om0.formid = om0.formid
总是正确的。将其更改为:
LEFT JOIN ordermeta om1 ON om0.formid = om1.formid
您也应该将条件 int he qhere 子句移动到连接子句中,因此整个查询如下所示:
SELECT om0.orderid AS order1, om1.orderid AS order2
FROM ordermeta om0
LEFT JOIN ordermeta om1 ON om0.formid = om0.formid
AND om0.orderid != om1.orderid
LEFT JOIN orders o0 ON om0.orderid = o0.orderid
LEFT JOIN orders o1 ON om1.orderid = o1.orderid
AND o0.userid = o1.userid