簡體   English   中英

MYSQL查詢雙聯接

[英]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

總有恰好一列d在每一行p ,由於外鍵引用。

但是每個m2md可能有多個行。 實際上,由於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中得到了改進,因此,如果您使用此解決方案,建議升級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM