2012-04-18 110 views
1

計數我什至不知道這是可能的...我會告訴你什麼是我的工作,我想怎樣做:的MySQL/PHP選擇並從多個表

狀態:

state_id 

鎮:

town_id 
state_id 
misc_property 

街道:

street_id 
town_id 
state_id 

這些設置在一個層次結構中。

我想選擇什麼:

我想選擇所有城鎮以及misc_property,而在選擇的狀態,同時它屬於計數所有的街道在該城。

這是我到目前爲止有:

$sql="SELECT 
    a.state_id AS state_id, 
    b.town_id AS town_id, 
    COUNT(c.street_id) 

    FROM 
    state a, 
    town b, 
    street c 

    WHERE 
    b.misc_property='$property'"; 

回答

2

使用此查詢:

SELECT 
    town.state_id AS state_id, 
    town.town_id AS town_id, 
    COUNT(street.street_id) AS count 
FROM 
    state INNER JOIN town ON state.state_id = town.state_id 
    LEFT JOIN street ON town.town_id = street.town_id 
GROUP BY 
    state_id, 
    town_id 
HAVING 
    town.misc_property = 'stuff'; 
+0

好的解決方案,bt should'nt JOIN是左連接而不是INNER連接?因爲可能存在一個沒有街道入口的小鎮。 (當然更多的是商業邏輯)。但我只是在當前問題的背景下發表評論。乾杯..! – 2012-04-18 19:53:38

+0

是的,好點,它應該是一個左連接。 – Nik 2012-04-18 19:54:15

+0

如果我需要從ID以外的狀態獲取某些東西,該怎麼辦? – lewicki 2012-04-18 20:07:35

0

您可以使用GROUP BY town_id有對特殊WHERE條件

0

使用聯接:

SELECT * FROM state 
LEFT JOIN town ON state.state_id = town.state_id 
LEFT JOIN street ON street.town_id = town.town_id 
WHERE town.misc_property = '$property' 
+1

你不算在街上。 – Nik 2012-04-18 19:46:10

+0

你說得對,我錯過了。是的,你的查詢似乎是做到這一點的最佳方式。 – 2012-04-18 19:48:36

0

你可以這樣做

$sql="SELECT 
    a.state_id AS state_id, 
    b.town_id AS town_id, 
    Select COUNT(c.street_id) From C Where C.town_id = b.town_id 

    FROM 
    state a, 
    town b, 
    street c 

    WHERE 
    b.misc_property='$property'and b.state_id = a.state_id " 
+0

你應該加入表格,而不是子查詢它們。 – Nik 2012-04-18 19:45:53

+0

耶加入是更好的,但只是爲了簡單編輯他的代碼 – ZERO 2012-04-18 19:53:52