[英]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 = PSS1400146
和Deelgebied = 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
总有恰好一列d
在每一行p
,由于外键引用。
但是每个m2m
或d
可能有多个行。 实际上,由于252为84 * 3,所以我想对于每个d
在m2m
中有三行(或者至少平均值为三行)。 因此,在合并的结果集中,行的数量增加了三倍,与m2m
的行不同,但重复了p
和d
的行。
有两种方法可以解决此问题:
每个p
只计数一次
我们知道在重复的行中,来自p
和d
的值是重复的。 因此,选择一个在p
或d
唯一的列,并仅计算其中的不同值。 我们不能选择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中得到了改进,因此,如果您使用此解决方案,建议升级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.