2012-08-29 20 views
0

我有一個表shop_inventory和另一個shops。我想從shop_inventoryshops其中cid=1 AND zbid!=0行數DISTINCT zbid。我試過這樣的:形成一個查詢返回兩個不同的表上的信息

SELECT COUNT(a.cid) shops,COUNT(DISTINCT b.zbid) buyers 
FROM shops a 
JOIN shop_inventory b ON b.cid=a.cid 
WHERE a.zbid!=0 AND a.cid=1 

然而,這返回100店鋪,而不是2,這是正確的答案。我想我不瞭解JOIN如何正確工作。有人可以爲這個查詢提供修復嗎?

+0

您似乎需要2個不同的查詢,或一個查詢與2個子查詢,因爲這些信息是完全獨立的?!? – Parallelis

+0

什麼是您的商店表的主要關鍵? –

+0

它是'cid,zbid'。 –

回答

1

許多相關行上的JOIN正在甩掉你店鋪的數量。

嘗試這種解決方案:

SELECT COUNT(DISTINCT a.cid, a.zbid) shops, 
     COUNT(DISTINCT b.zbid) buyers 
FROM shops a 
JOIN shop_inventory b ON a.cid = b.cid 
WHERE a.cid = 1 AND a.zbid <> 0 
+0

這仍然會返回100個商店,而不是2. –

+0

@KeirSimmons,許多行上的JOIN正在拋棄商店的數量。試用我的修改後的解決方案。 –

+0

感謝這件作品魅力。爲什麼第一個COUNT中額外的'a.zbid'會產生這樣的差異? –

0

如果這讓你你想要的店鋪數:

SELECT COUNT(1) AS shops 
    FROM shops a 
WHERE a.zbid != 0 
    AND a.cid = 1 

然後一個包括一個數從另一個表是使用相關子查詢的方式。 (有使用這種方法的一些性能問題,這個效果很好,如果外部查詢返回行的數量有限。)

SELECT COUNT(1) AS shops 
    , (SELECT COUNT(DISTINCT b.zbid) 
      FROM shop_inventory b 
      WHERE b.cid = a.cid 
     ) AS buyers 
    FROM shops a 
WHERE a.zbid != 0 
    AND a.cid = 1 

另一種方法是使用連接的子查詢(內嵌視圖)...

SELECT COUNT(1) AS shops 
    , c.buyers AS buyers 
    FROM shops a 
    JOIN (SELECT b.cid, COUNT(DISTINCT b.zbid) AS buyers 
      FROM shop_inventory b 
      WHERE b.cid = 1 
      GROUP BY b.cid 
     ) c 
WHERE a.zbid != 0 
    AND a.cid = 1 
    AND a.cid = c.cid 

如果那些不返回您正在尋找的結果集,那麼我可能誤解了規範。

相關問題