2012-04-18 2 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 ПРИСОЕДИНЯЙТЕСЬ, ЧТОБЫ ВЛЕВО, а не INNER присоединиться? потому что там может быть город без входа на улицу. (конечно, это больше бизнес-логики). но просто комментирую в контексте текущего вопроса. ура ..! –

+0

Да, хороший момент, это должно быть левое соединение. – Nik

+0

Что делать, если мне нужно было что-то захватить из состояния, кроме идентификатора? – lewicki

0

вы можете использовать GROUP BY town_id с HAVING для специальных 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

+0

Вы правы, я пропустил это. Да, ваш запрос, кажется, лучший способ сделать это. –

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

+0

да, лучше, но просто для того, чтобы упростить редактирование его кода – ZERO

Смежные вопросы