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

Форум MySQL

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

 

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

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

тема: Вывод количества результатов поиска перед самими результатами
 
 автор: Rustamich   (29.11.2009 в 15:08)   письмо автору
 
 

Необходимо вывести количество найденных данных, а затем таблицу с этими данными.

Сама выборка данных в таблицу результатов выглядит так:


<? 
$total_firms 
0;    $total_address 0
$query_firms $db->query('SELECT DISTINCT f.firm_id, f.name, c.name AS city FROM firms AS f 
  INNER JOIN cities AS c ON f.city_id = c.city_id 
  INNER JOIN f_rubrics AS fr ON f.firm_id = fr.firm_id 
  INNER JOIN f_address AS fa ON f.firm_id = fa.firm_id 
  INNER JOIN rubrics AS r ON fr.rubric_id = r.rubric_id WHERE '
.$where.' ORDER BY '.$orderby); 
if (
$db->num_rows($query_firms) > 0) { 
  while (
$row_firms $db->get_array($query_firms)) { 
    
$total_firms++; 
    if (
$total_firms == 0) {$oddclass 'even';} else {$oddclass 'odd';} 
    
$firm['id']   = $row_firms['firm_id']; 
    
$firm['name'] = $row_firms['name']; 
    
$firm['city'] = $row_firms['city']; 
     
    
$query_address $db->query('SELECT s.name AS street, fa.house FROM `f_address` AS fa 
      LEFT JOIN streets AS s ON fa.street_id  = s.street_id WHERE fa.firm_id='
.$firm['id'].' ORDER BY s.name'); 
    if (
$db->num_rows($query_address) > 0) { 
      
$streets '<ul>'$houses '<ul>'
      while (
$row_address $db->get_array($query_address)) { 
        
$total_address++; 
        
$address['street'] = $row_address['street']; 
        
$address['house'] = $row_address['house']; 
        
$streets .= '<li>'.$address['street'].'</li>'
        
$houses .= '<li>'.$address['house'].'</li>'
      } 
      
$streets .= '</ul>'$houses .= '</ul>'
    } 

    
$query_rubrics $db->query('SELECT r.name AS subrubric FROM `f_rubrics` AS fr 
      INNER JOIN rubrics AS r ON fr.rubric_id = r.rubric_id WHERE fr.firm_id='
.$firm['id'].' ORDER BY r.name'); 
    if (
$db->num_rows($query_rubrics) > 0) { 
      
$rubrics '<ul>'
      while (
$row_rubrics $db->get_array($query_rubrics)) { 
        
$rubric['subrubric'] = $row_rubrics['subrubric']; 
        
$rubrics .= '<li>'.$rubric['subrubric'].'</li>'
      } 
      
$rubrics .= '</ul>'
    } 
     
    
$list .= '<tr class="'.$oddclass.'" id="str'.$firm['id'].'" onClick="return CheckTR(this);"> 
      <td class="check"><input type="checkbox" name="id[]" value="'
.$firm['id'].'" id="chb'.$firm['id'].'" onclick="return CheckCB(this);"></td> 
      <td class="bold"><a href="?go='
.$this->section.'&page='.$this->subsection.'&action=edit&sort='.$sort.'&id='.$firm['id'].'&rg='.$rgid.'&c='.$cid.'&r='.$rid.'&sr='.$srid.'&n='.$n.'" title="Редактировать">'.$firm['name'].'</a></td> 
      <td>'
.$streets.'</td> 
      <td class="action" style="width:50px">'
.$houses.'</td> 
      <td>'
.$rubrics.'</td> 
      <td class="action">'
.$firm['city'].'</td> 
      <td class="action"><nobr> 
        <a href="?go='
.$this->section.'&page='.$this->subsection.'&action=edit&sort='.$sort.'&id='.$firm['id'].'&rg='.$rgid.'&c='.$cid.'&r='.$rid.'&sr='.$srid.'&n='.$n.'" title="Редактировать" style="margin-right:10px"><img src="img/edit.png" width="18" height="18"/></a> 
        <a onclick="return quest(Вы действительно хотите удалить выбранную строку без возможности восcтановления?);"  href="?go='
.$this->section.'&page='.$this->subsection.'&rg='.$rgid.'&c='.$cid.'&r='.$rid.'&sr='.$rid.'&action=delete&id='.$firm_id.'" title="Удалить"><img src="img/delete.png" width="18" height="18"/></a></nobr> 
      </td></tr>'

  }   

?>


Понимаю, $total_firms можно посчитать просто той же mysql_num_rows(), но тут я это делаю для окраски четных и нечетных строк в разные цвета.
Результат вообще выводится так: Фирма, все её адреса, все ею рубрики, город.

Затем я вывожу
$total_firms, $total_address
и после ту самую переменную $list со списком результатов.

Показываю таблицы в укороченном виде, т.е только те поля, которые используются в запросе


Таблица firms - в ней хранятся сами фирмы 
firm_id     int(10)    auto_increment                                
name     varchar(255)                                          
city_id     int(6)                                     

Таблица f_address - в ней хранятся адреса фирм, т.е в одном городе фирма может находиться на разных адресах 
f_address_id     int(14)    auto_increment                                
firm_id     int(10) 
street_id     int(7) 
house     varchar(10) 

Таблица f_rubrics - фирма может находиться в разных рубриках 
f_rubric_id     int(14) auto_increment                                
firm_id     int(10)                                          
rubric_id     int(5) 

Таблица rubrics
rubric_id     int(5) auto_increment                                
name     varchar(100)                                          
parent_id     int(5) 

Таблица streets
street_id     int(7) auto_increment                                
name     varchar(50) 
city_id     int(6) 

Таблица cities 
city_id     int(6) auto_increment                                
name     varchar(50)

  Ответить  
 
 автор: Valick   (30.11.2009 в 09:31)   письмо автору
 
   для: Rustamich   (29.11.2009 в 15:08)
 

Не могу сказать точно, но я бы базу спроектировал несколько иначе.
Хотя вся загвоздка, я так понимаю с выборкой по рубрикам (или еще точнее из-за того что у одной фирмы есть разные адреса, отсюда и множество циклов) и получить нужно:
Пример вывода:
Найдено: Организаций - 5; Адресов - 10.

А ниже таблица с этими организациями и адресами.


Мне кажется фирму с разными адресами вы представляете как одну сущность, если избавиться от этого, то это -1 цикл запросов.
1 запрос должен выбрать количество фирм удовлетворяющих условию выборки (я так понимаю это Ваш первый запрос, хотя лично мне он не очень нравиться)
2 запрос должен выбрать все адреса всех фирм полученных в результате первого запроса
(если не ошибаюсь, то у вас тут цикл, а от него как раз нужно избавиться)

какие поля у вас проиндексированы?

если я правильно понял, то выборка происходит по определенным рубрикам, а в сводной таблице нужно указать фирмы, города, адреса и все рубрики в которых присутствует фирма, так?

  Ответить  
 
 автор: Rustamich   (01.12.2009 в 07:15)   письмо автору
 
   для: Valick   (30.11.2009 в 09:31)
 

Здраствуйте, не могли бы сказать хотя бы в чем ошибка спроектированной базы, что бы вы изменили?

Поясните пожалуйста, что Вы имеете в виду по поводу фирмы с разными адресами представленная как одна сущность и как можно от этого избавиться?

Вы правильно поняли по поводу сводной таблицы. Там идет, фирма, затем все адреса, где она расположена, затем все рубрики, и город, который у фирмы одни. Т.е она может расплагаться на разных улицах, но в пределах одного города.

  Ответить  
 
 автор: Valick   (02.12.2009 в 15:14)   письмо автору
 
   для: Rustamich   (01.12.2009 в 07:15)
 


Таблица firms - в ней хранятся сами фирмы 
firm_id     int(10)    auto_increment                                
name     varchar(255)                                                                              
___
убираем city_id     int(6) 

Таблица f_address - в ней хранятся адреса фирм, т.е в одном городе фирма может находиться на разных адресах 
f_address_id     int(14)    auto_increment                                
firm_id     int(10) 
city_id     int(6) 
street_id     int(7) 
house     varchar(10)
___
добавляем city_id     int(6)  

Таблица f_rubrics - фирма может находиться в разных рубриках                                
firm_id     int(10)                                          
rubric_id     int(5) 

первичный ключ на оба поля (хотя может я и не прав)

Таблица rubrics
rubric_id     int(5) auto_increment                                
name     varchar(100)                                          
parent_id     int(5) 

Таблица streets
street_id     int(7) auto_increment                                
name     varchar(50) 
___
убираем city_id     int(6) 

Таблица cities 
city_id     int(6) auto_increment                                
name     varchar(50) 

  Ответить  
 
 автор: Trianon   (02.12.2009 в 15:39)   письмо автору
 
   для: Valick   (02.12.2009 в 15:14)
 

firms.city_id я бы убрал.
а firms.address_id - добавил бы.

А еще определился бы с таблицей streets .
Перенос поля city_id из streets в address допустим лишь в том случае, если таблица streets описывает названия улиц. Если она описывает сами улицы - поле нужно оставить в этой таблице.

  Ответить  
 
 автор: Valick   (02.12.2009 в 18:21)   письмо автору
 
   для: Trianon   (02.12.2009 в 15:39)
 

а firms.address_id - добавил бы.
а зачем? если одна фирма имеет много адресов? (и не факт что в одном городе, пусть даже автору сегодня требуется фирма в пределах города, но кто знает что будет завтра) В этой таблице жёстко задано соответствие фирмы определенному идентификатору, что бы в таблице f_address отличать фирмы друг от друга, даже если они имеют одинаковые названия.
Собственно говоря таблица f_address - это и есть сущность фирмы, просто не стал переименовывать

Так же и для улиц, в моем случае это всего лишь названия... для конкретизации, я ввел бы еще одну таблицу
плохо что автор указал укороченные таблицы

  Ответить  
 
 автор: Trianon   (02.12.2009 в 19:15)   письмо автору
 
   для: Valick   (02.12.2009 в 18:21)
 

>а firms.address_id - добавил бы.
>а зачем? если одна фирма имеет много адресов?
Юридический - один.
Конечно, он никак не связан с территориями филиалов.

>Так же и для улиц, в моем случае это всего лишь названия...

То в Вашем.

  Ответить  
 
 автор: Valick   (02.12.2009 в 20:35)   письмо автору
 
   для: Trianon   (02.12.2009 в 19:15)
 

Так и не понял, согласились Вы со мной или нет по первому пункту..
Допустим есть две фирмы
1) "Василиса" - организация детских праздников и дней рождения.
2) "Василиса" - досуг, эскорт услуги.
Как вы отличите их друг от друга в (не)вашей таблице? (id | firm_id | addres_firm_id)

по второму пункту достаточно одной таблетки новой таблицы со связями городов и улиц

  Ответить  
 
 автор: Trianon   (03.12.2009 в 01:48)   письмо автору
 
   для: Valick   (02.12.2009 в 20:35)
 

В смысле?
>Так и не понял, согласились Вы со мной или нет по первому пункту..
>Допустим есть две фирмы
>1) "Василиса" - организация детских праздников и дней рождения.
>2) "Василиса" - досуг, эскорт услуги.
>Как вы отличите их друг от друга в (не)вашей таблице? (id | firm_id | addres_firm_id)

(id | firm_id | addres_firm_id) - это запись в какой таблице? Таблицы с такими полями я не узрел ни у Вас, ни у меня, ни у автора.

  Ответить  
 
 автор: Valick   (03.12.2009 в 09:54)   письмо автору
 
   для: Trianon   (03.12.2009 в 01:48)
 

ошибся немного
речь о таблице firms (firm_id | name | addres_id)
вопрос тот же.

  Ответить  
 
 автор: Trianon   (03.12.2009 в 12:25)   письмо автору
 
   для: Valick   (03.12.2009 в 09:54)
 

там, очевидно, будут еще какие-то поля, как минимум description
ну и заполнение, к примеру
(12, 'Василиса', 7, 'организация детских праздников и дней рождения'),
(35, 'Василиса', 82, 'досуг, эскорт услуги'),
На поле name ставится обычный, неуникальный индекс.

Точно также как с ФИО персоны в таблицах с любыми персональными данными.
Важно, кстати, не description.
Важно firms.firm_id
Потому что оно не firm_names.firmname_id

  Ответить  
 
 автор: Valick   (03.12.2009 в 14:34)   письмо автору
 
   для: Trianon   (03.12.2009 в 12:25)
 

я не против каких-то там полей как таковых, я против полей которые мешают 3-му уровню нормализации, и если я все таки не ошибаюсь, то description как раз такое поле, так как оно не зависит от первичного ключа.
Да и как сами Вы говорите что description неважно, абсолютно с Вами согласен, потому-то в моей таблице его и нет, так как первичный ключ справляется с задачей и без "помощников"

____
опять неправильно сказал... description зависит от имени (или наоборот), а этого в 3 нормальной форме быть не должно.

  Ответить  
 
 автор: Trianon   (03.12.2009 в 17:31)   письмо автору
 
   для: Valick   (03.12.2009 в 14:34)
 

Я не вижу зависимости описания от имени. Можете пояснить?
Зависимость от сущности вижу - и это естественно.
Зависимости от имени - не вижу.

  Ответить  
 
 автор: Valick   (03.12.2009 в 17:52)   письмо автору
 
   для: Trianon   (03.12.2009 в 17:31)
 

конечно могу :)
(12, 'Василиса', 7, 'организация детских праздников') - 1 филиал компании 7
(17, 'Василиса', 7, 'организация дней рождения') - 2 филиал компании 7
(35, 'Василиса', 82, 'досуг, эскорт услуги'), - 1 филиал компании 82

в итоге поле name (Василиса) зависит от поля description (7)

  Ответить  
 
 автор: Trianon   (03.12.2009 в 18:03)   письмо автору
 
   для: Valick   (03.12.2009 в 17:52)
 

стоп.
12 и 17 - это две разные органицации или одна и та же?

семерка - это не идентификатор компании. Это лишь чужой ключ в таблицу адресов.

Две организации могут именть одно и то же название (хотя маловероятно, что они будут при этом зарегистрированы по одному адресу.)
Но если это одна организация - то и строка у нее должна быть одна.

  Ответить  
 
 автор: Valick   (03.12.2009 в 18:07)   письмо автору
 
   для: Trianon   (03.12.2009 в 18:03)
 

Ну вот)) 12 и 17 получается одна компания
Теперь посмотрите на мой вариант

Таблица firms - в ней хранятся сами фирмы
firm_id int(10) auto_increment
name varchar(255)

Таблица f_address - в ней хранятся адреса фирм, т.е в одном городе фирма может находиться на разных адресах
f_address_id int(14) auto_increment
firm_id int(10)
city_id int(6)
street_id int(7)
house varchar(10)

я просто скопипастил таблицы автора и внес некоторые изменения, а описания к таблицам остались, вот и ввел в заблуждение
можно конечно было f_address разделить это на две таблицы адреса и филиалы.... но надо ли это.. вопрос спорный

  Ответить  
 
 автор: Trianon   (03.12.2009 в 22:46)   письмо автору
 
   для: Valick   (03.12.2009 в 18:07)
 

>Ну вот)) 12 и 17 получается одна компания
тогда не будет двух строк в таблице. И двух первичных ключей тоже не будет.

  Ответить  
 
 автор: Valick   (04.12.2009 в 14:39)   письмо автору
7.9 Кб
 
   для: Rustamich   (01.12.2009 в 07:15)
 

Вы так и не ответили на каких полях у Вас индексы.
Вот я тут набросал немного кода посмотрите, в частности как реализована зебра.

  Ответить  
 
 автор: Rustamich   (14.12.2009 в 11:55)   письмо автору
 
   для: Rustamich   (29.11.2009 в 15:08)
 

Позвольте немного разъяснить.

1. Таблица streets - это не просто перечисление названий улиц, это именно улицы, находящиеся в определенном городе. Если я убиру оттуда city_id, то в дальнейшем, допустим при переименовании улицы в каком-нибудь городе, например "Ленина" , во всех остальных городах эта улица тоже примет новое название.

2. Одна фирма может находиться в одном городе но на разных адресах, поэтому, я думаю нет смысла добавлять city_id в таблицу f_address и следовательно убирать city_id из таблицы firms.

3. По поводу
Таблица f_rubrics - фирма может находиться в разных рубриках                                 
firm_id     int(10)                                           
rubric_id     int(5)  

первичный ключ на оба поля (хотя может я и не прав)


Интересная идея, тогда не нужно заморачиваться о размерности f_rubric_id. Но тогда возникает вопрос, не замедлится ли поиск фирмы по рубрикам?

4. Такой вопрос - вообще есть еще одна таблица regions в которой указаны области, и таблица cities связана с regions с помощью region_id. Есть ли смысл объединить таблицы regions, cities и streets в одну, ведь по сути это одна сущность, или это не так?

  Ответить  
 
 автор: Trianon   (14.12.2009 в 12:18)   письмо автору
 
   для: Rustamich   (14.12.2009 в 11:55)
 

>1. Таблица streets - это не просто перечисление названий улиц, это именно улицы, находящиеся в определенном городе. Если я убиру оттуда city_id, то в дальнейшем, допустим при переименовании улицы в каком-нибудь городе, например "Ленина" , во всех остальных городах эта улица тоже примет новое название.

Это как раз то, в чем я и пытался убедить Вашего оппонента.

>2. Одна фирма может находиться в одном городе но на разных адресах, поэтому, я думаю нет смысла добавлять city_id в таблицу f_address и следовательно убирать city_id из таблицы firms.


Верно, подразделения могут быть где угодно, но юридическая привязка так или иначе опирается на одну точку ( вне связи с физическим размещением площадок) А значит поле может быть в обеих таблицах, обозначая разные свойства.


>3. По поводу
>>Таблица f_rubrics - фирма может находиться в разных рубриках
>>firm_id int(10)
>>rubric_id int(5)
>>первичный ключ на оба поля (хотя может я и не прав)
>
>Интересная идея, тогда не нужно заморачиваться о размерности f_rubric_id. Но тогда возникает вопрос, не замедлится ли поиск фирмы по рубрикам?

Можно же добавить отдельный индекс по rubric_id или даже встречный уникальный ключ по
rubric_id, firm_id

>4. Такой вопрос - вообще есть еще одна таблица regions в которой указаны области, и таблица cities связана с regions с помощью region_id. Есть ли смысл объединить таблицы regions, cities и streets в одну, ведь по сути это одна сущность, или это не так?

А разве она одна?

PS.

и ёперный театр. ну не трогайте Вы BB-тег code там где он ни в п. ни в к.а.

  Ответить  
 
 автор: Rustamich   (14.12.2009 в 12:27)   письмо автору
 
   для: Trianon   (14.12.2009 в 12:18)
 

Ну допустим у меня рубрики и подрубрики это одна сущность. Почему Область и город не могут быть тоже одной сущность?

  Ответить  
 
 автор: Trianon   (14.12.2009 в 12:34)   письмо автору
 
   для: Rustamich   (14.12.2009 в 12:27)
 

И как будет называться эта сущность?

  Ответить  
 
 автор: Rustamich   (14.12.2009 в 13:00)   письмо автору
 
   для: Trianon   (14.12.2009 в 12:34)
 

география к пример.

  Ответить  
 
 автор: Trianon   (14.12.2009 в 13:03)   письмо автору
 
   для: Rustamich   (14.12.2009 в 13:00)
 

Тогда - конечно.
Только будет ли она полезна Вам без опоры на физические сущности?

  Ответить  
 
 автор: Rustamich   (14.12.2009 в 13:16)   письмо автору
 
   для: Trianon   (14.12.2009 в 13:03)
 

Нет, я, конечно, за отдельные сущности в данном вопросе, просто у всех разные мысли на этот счет, поэтому я и спросил. Благодарю за ответ!

  Ответить  
Rambler's Top100
вверх

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