选择满足条件的每个字段

时间:2020-03-01 06:31:09

标签: mysql sql

我有一个电话表制作

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

我有一些嵌套的自联接和重命名,但是我无法确定如何针对这种情况应用EXISTSIN,这种情况“对于工厂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属性的重命名。

3 个答案:

答案 0 :(得分:2)

您需要为每个工厂配对使用JOIN表,以确保它们“联接”在相同的product_id上,否则可能会导致DISTINCT product_id的计数相似但这些不一定指的是相同 product_id

这是我的看法:

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上运行,而无需进行任何更改。

答案 1 :(得分:1)

您可以这样操作:

SUM(VALUE) as sumOfValues

输出:

        select A as factory_name_1 , B as factory_name_2
        from
        (
            select A, B, count(*) as Count_
            from
            (
            select a.factory_name as A, b.factory_name as B 
            from yourtable a 
            inner join yourtable b
            on a.product_id = b.product_id and a.factory_id <> b.factory_id
            )a group by A, B
        )a 
        inner join 
       (select factory_name, count(*) as Count_ from yourtable group by factory_name) b 
       on a.A = b.factory_name and a.Count_ = b.Count_
       Order by 1

答案 2 :(得分:0)

其他解决方案似乎比必要的更为复杂。这基本上是一个带有聚合的自联接:

with t as (
      select t.*, count(*) over (partition by factory_id) as cnt
      from tbl t
     )
select t1.factory_id, t2.factory_id, t1.factory_name, t2.factory_name, count(*)
from t t1 join
     t t2
     on t1.product_id = t2.product_id and t1.factory_id <> t2.factory_id
group by t1.factory_id, t2.factory_id, t1.factory_name, t2.factory_name, t1.cnt
having count(*) = max(t1.cnt);

Here是db <>小提琴。