Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно составить запрос???
 
 автор: Roma   (26.09.2007 в 14:12)   письмо автору
 
 

Всем привет!!! Вопрос такого плана:
имеется таблица 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:45)   письмо автору
 
   для: 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

Запрос не выполняется

   
 
 автор: oradev   (26.09.2007 в 21:39)   письмо автору
 
   для: 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          

   
 
 автор: Roma   (27.09.2007 в 11:00)   письмо автору
 
   для: oradev   (26.09.2007 в 21:39)
 

Спасибо большое, oradev!!! Ваш запрос выполняется более чем в 3 раза быстрее, моего)))

   
 
 автор: oradev   (27.09.2007 в 11:38)   письмо автору
 
   для: Roma   (27.09.2007 в 11:00)
 

Обращайтесс....

   
 
 автор: Roma   (27.09.2007 в 15:41)   письмо автору
 
   для: oradev   (27.09.2007 в 11:38)
 

Уже обращаюс))
1. возможно,вопрос глупый, но все же, чем отличается left outer join от left join?
2. мне нужно было доклеить к запросу еще 2 таблицы и для использования left join мне понадобилось создать индексы на полях... действительно ли есть необходимость в создании индексов при использовании left join?

   
 
 автор: oradev   (27.09.2007 в 15:51)   письмо автору
 
   для: Roma   (27.09.2007 в 15:41)
 

1. в действительности одно и тоже
2. при создании индексов имеете ввиду, что индексы по ограничениям Primary key и UNIQUE - создаются автоматически

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования