mysql - 选择满足条件的每个字段
问题描述
我有一个表调用生产
factory_id | factory_name | product_id
1 | A | 1
1 | A | 2
1 | A | 3
2 | B | 3
3 | C | 1
3 | C | 2
3 | C | 3
3 | C | 4
3 | C | 5
我正在尝试开发一个查询,它将返回两个工厂名称对,这样 factory1 的每个产品都由 factory2 生产,结果如下所示:
factory_name_1 | factory_name_2
A | C
B | A
B | C
我有一些嵌套的自联接和重命名,但我无法理解如何应用EXISTS
或IN
对于“为工厂 X 生产的每种产品做条件”的这种情况。感谢任何高级帮助。
更新:对不起,我忘了粘贴我的查询:
select t0.fname0, t1.fname1
from (
select factory_id as fid0, factory_name as fname0, product_id as pid0, count(distinct factory_id, product_id) as pnum0
from production
group by factory_id
) t0
join
(
select factory_id as fid1, factory_name as fname1, product_id as pid1, count(distinct factory_id, product_id) as pnum1
from production
group by factory_id
) t1
where t0.fid0 <> t1.fid1
and t0.pnum0 < t1.pnum1
and t0.pid0 = t1.pid1;
更新 2:生产是唯一的表。预期的输出 factory1 和 factory2 只是 factory_name 属性的重命名。
解决方案
您需要JOIN
查看每个工厂配对的表格,以确保它们“加入”相同product_id
的 s,否则您最终可能会得到类似的 DISTINCT 计数,product_id
但这些不一定指的是相同 product_id
的 s。
这是我的看法:
SELECT bfna,afna, pcnt FROM (
SELECT a.factory_name afna, b.factory_name bfna, COUNT(DISTINCT b.product_id) commoncnt
FROM tbl a LEFT JOIN tbl b ON b.factory_name!=a.factory_name AND b.product_id=a.product_id
GROUP BY a.factory_name, b.factory_name
) c
INNER JOIN (
SELECT factory_name fna, COUNT(DISTINCT product_id) pcnt
FROM TBL GROUP BY factory_name
) d ON fna=bfna AND commoncnt=pcnt
ORDER BY bfna,afna
你可以在这里找到一个演示:https ://rextester.com/JJGCK84904
它产生:
bfna afna commoncnt
A C 3
B A 1
B C 1
为简单起见,我省略了该列factory_id
,因为它没有在此处添加任何信息。
有趣的事实:由于我只使用“简单”的 SQL 表达式,所以上面的代码也可以在 SQL-Server 上运行而无需任何更改。
推荐阅读
- python - 如何指定多个范围限制?
- mysql - 我怎样才能加入三个表
- python - 试图让用户向页面添加新主题,但页面只返回项目符号,没有主题名称。在管理后端工作正常,但无法达到目的
- javascript - 通过提交事件提交表单,其中包含名为 submit 的隐藏字段
- java - KeyStore.load() 因“无效的密钥库格式”而失败
- swift - 具有 1 项的 FunctionBuilder
- c++ - 如何将模板类添加到堆栈数组?
- webassembly - WebAssembly 从 C 调用 JavaScript 函数作为函数指针
- ruby-on-rails - 如何理解“ActiveRecord::Migration[5.2]”rails / ruby
- hyperledger-fabric - 向 fabric-sdk-go 查询链码时出现恐慌