|
|
|
| Всем привет!!! Вопрос такого плана:
имеется таблица location
ID
MASTER_ID
NAME
LEVEL (1-Страна, 2-Регион, 3-Город)
Мне нужно посчитать количество регионов,городов в стране
т.е должна быть такая таблица
Страна |Кол.регионов|Кол городов|
--------------------------------------------------
Страна1 | 1 | 2 |
Страна2 | 3 | 4 |
и т.д
Сделал так
<?php
$country_query=mysql_query("select ID,NAME from location where level=1");
if($country_query)
{
while($country=mysql_fetch_array($country_query))
{
$ID_COUNTRY=$country['ID'];
$region_count_query=mysql_query("select count(ID) from location where master_id=$ID_COUNTRY");
if($region_count_query) $region_count=mysql_result($region_count_query,0);
$region_query=mysql_query("select ID from location where master_id=$ID_COUNTRY");
if($region_query)
{
$city_count=0;
while($region=mysql_fetch_array($region_query))
{
$ID_REGION=$region['ID'];
$city_count_query=mysql_query("select count(ID) from location where master_id=$ID_REGION");
$city_count+=mysql_result($city_count_query,0);
}
echo $country['NAME']." | ".$region_count." | ".$city_count."<br>";
}
}
}
?>
|
Думаю,что есть способ проще для рещения данной задачи (возможно какой-нибудь многотабличный запрос). Подскажите пожалуйста кто знает. Заранее спасибо | |
|
|
|
|
|
|
|
для: Roma
(26.09.2007 в 14:12)
| | Пробовал сделать такой запрос для вывода таблицы
Страна | Регион
----------------------
Страна1 | 10
Страна2 | 20
select loc1.ID as name, count(loc2.ID) as count2 from location as loc1 JOIN location as loc2 on loc2.MASTER_ID=loc1.ID where loc1.LEVEL=1
|
Запрос не выполняется | |
|
|
|
|
|
|
|
для: Roma
(26.09.2007 в 14:45)
| |
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 64-bit Linux Debian: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
SQL> -- начало эмуляции тестовых данных
SQL> with location as (
2 select 1 ID, null MASTER_ID, 'Страна1' NAME, 1 LLEVEL FROM DUAL union all
3 select 2 ID, 1 MASTER_ID, 'Регион1' NAME, 2 LLEVEL FROM DUAL union all
4 select 3 ID, 2 MASTER_ID, 'Город1' NAME, 3 LLEVEL FROM DUAL union all
5 select 4 ID, 2 MASTER_ID, 'Город2' NAME, 3 LLEVEL FROM DUAL union all
6 select 5 ID, null MASTER_ID, 'Страна2' NAME, 1 LLEVEL FROM DUAL union all
7 select 6 ID, 5 MASTER_ID, 'Регион2' NAME, 2 LLEVEL FROM DUAL union all
8 select 7 ID, 6 MASTER_ID, 'Город3' NAME, 3 LLEVEL FROM DUAL union all
9 select 8 ID, 5 MASTER_ID, 'Регион3' NAME, 2 LLEVEL FROM DUAL union all
10 select 9 ID, 8 MASTER_ID, 'Город4' NAME, 3 LLEVEL FROM DUAL union all
11 select 10 ID, 5 MASTER_ID, 'Регион4' NAME, 2 LLEVEL FROM DUAL union all
12 select 11 ID, 10 MASTER_ID, 'Город5' NAME, 3 LLEVEL FROM DUAL union all
13 select 12 ID, 10 MASTER_ID, 'Город6' NAME, 3 LLEVEL FROM DUAL union all
14 select 13 ID, 5 MASTER_ID, 'Регион5' NAME, 2 LLEVEL FROM DUAL union all
15 select 14 ID, 13 MASTER_ID, 'Город7' NAME, 3 LLEVEL FROM DUAL union all
16 select 15 ID, null MASTER_ID, 'Страна3' NAME, 1 LLEVEL FROM DUAL
17 )
18 -- сам запрос (его копируете и выполняете в MySQL)
19 SELECT a.NAME COUNTRY, count(distinct b.id) REG, count(c.id) city
20 FROM location a
21 left outer join location b on a.id = b.MASTER_ID and b.llevel = 2
22 left outer join location c on b.id = c.MASTER_ID and c.llevel = 3
23 WHERE a.LLEVEL=1
24 GROUP BY a.id, a.name;
COUNTRY REG CITY
------- ---------- ----------
Страна1 1 2
Страна2 4 5
Страна3 0 0
|
| |
|
|
|
|
|
|
|
для: oradev
(26.09.2007 в 21:39)
| | Спасибо большое, oradev!!! Ваш запрос выполняется более чем в 3 раза быстрее, моего))) | |
|
|
|
|
|
|
|
для: Roma
(27.09.2007 в 11:00)
| | Обращайтесс.... | |
|
|
|
|
|
|
|
для: oradev
(27.09.2007 в 11:38)
| | Уже обращаюс))
1. возможно,вопрос глупый, но все же, чем отличается left outer join от left join?
2. мне нужно было доклеить к запросу еще 2 таблицы и для использования left join мне понадобилось создать индексы на полях... действительно ли есть необходимость в создании индексов при использовании left join? | |
|
|
|
|
|
|
|
для: Roma
(27.09.2007 в 15:41)
| | 1. в действительности одно и тоже
2. при создании индексов имеете ввиду, что индексы по ограничениям Primary key и UNIQUE - создаются автоматически | |
|
|
|