2012-04-18 85 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