1

これは私のクエリです:

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`

psttodo-inSequal Pro で自分のテーブルをチェックして、行を選択する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
4

1 に答える 1

1

外部キー参照のため、 のd各行には常に正確に 1 つの行があります。p

m2mただし、 for each または には複数の行がある場合がありますdm2m実際、252 は 84 * 3 であるため、それぞれに 3 つの行があると推測できますd(少なくとも平均は 3 つです)。したがって、結合された結果セットでは、行が 3 倍になり、 からの行は異なりますが、 からの行とm2mからの行が繰り返されます。pd

これを修正するには、いくつかの方法があります。

pそれぞれを1回だけ数えます

p繰り返される行では、との値が繰り返されることがわかっていますd。したがって、 または のいずれpかで一意であることがわかっている列を選択し、dその中の個別の値のみをカウントします。d2 つの異なるエントリ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`

準結合を使用する

準結合は、複数の一致がある場合でも、結果の 1 つの行のみを返します。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 で改善されたため、このソリューションを使用する場合はアップグレードすることをお勧めします。

于 2014-04-22T16:45:19.730 に答える