MYSQL Query double JOIN


MYSQL Query double JOIN

这是我的查询:

SELECT count(*) AS COUNT
FROM `psttodo-in` p
INNER JOIN `deelgebied` d 
    ON d.`Segmentcode` = p.`Segment No_ PST`
    AND d.`Deelgebied` = p.`Deelgebied`
INNER JOIN m2m 
    ON m2m.`deelgebied` = d.`deelgebiedID`
WHERE 
    p.`Segment No_ PST` = 'PSS1400146'
    AND p.`Deelgebied` = 2
ORDER BY `afgewerkt tablet datum`

现在,当我在Sequal Pro中检查表psttodo-in并选择其中Segment No_ PST = PSS1400146Deelgebied = 2计数为84的行时。但是当我运行查询时,我得到了252的结果。我做错了什么?

更新

我的表格结构:

table psttodo-in:
    PK No_
    Hostess Code
    Segment No_
    FK Deelgebied
    ....
table deelgebied
    Segmentcode
    Deelgebied
    map
    DeelgebiedID
    pst-active
table m2m
    PK m2mID
    FK deelgebied
    FK psthostess

由于外键引用,p中的每一行在d中总是正好有一行。

但是在CCD_ 8中对于每个或在d中可能存在多行。事实上,由于252是84*3,我猜对于每个dm2m中有三行(或者至少平均值是三行)。因此,在连接的结果集中,行是三倍的,具有来自m2m的不同行,但是来自pd的行是重复的。

有几种方法可以解决这个问题:

每个p只计数一次

我们知道,在重复的行中,来自pd的值是重复的。因此,选择一个在pd中已知唯一的列,并只计算其中不同的值。我们不能选择d,因为如果两个不同的p条目引用相同的d,这些值可能会被合法地选择多次。因此,选择p的主键:

SELECT COUNT(DISTINCT p.NO_) AS COUNT
FROM `psttodo-in` p
INNER JOIN `deelgebied` d 
    ON d.`Segmentcode` = p.`Segment No_ PST`
    AND d.`Deelgebied` = p.`Deelgebied`
INNER JOIN m2m 
    ON m2m.`deelgebied` = d.`deelgebiedID`
WHERE 
    p.`Segment No_ PST` = 'PSS1400146'
    AND p.`Deelgebied` = 2
ORDER BY `afgewerkt tablet datum`

使用半联接

即使有多个匹配项,半联接也只返回结果的一行。在SQL中编写半联接的方法如下:

SELECT COUNT(*) AS COUNT
FROM `psttodo-in` p
INNER JOIN `deelgebied` d 
    ON d.`Segmentcode` = p.`Segment No_ PST`
    AND d.`Deelgebied` = p.`Deelgebied`
WHERE 
    p.`Segment No_ PST` = 'PSS1400146'
    AND p.`Deelgebied` = 2
    AND EXISTS (SELECT * FROM m2m WHERE m2m.`deelgebied` = d.`deelgebiedID`)
ORDER BY `afgewerkt tablet datum`

MySQL 5.6中改进了半联接优化,因此如果您使用此解决方案,我建议您升级。