|
|
|
| Необходимо вывести количество найденных данных, а затем таблицу с этими данными.
Сама выборка данных в таблицу результатов выглядит так:
<?
$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 % 2 == 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)
|
| |
|
|
|
|
|
|
|
для: Rustamich
(29.11.2009 в 15:08)
| | Не могу сказать точно, но я бы базу спроектировал несколько иначе.
Хотя вся загвоздка, я так понимаю с выборкой по рубрикам (или еще точнее из-за того что у одной фирмы есть разные адреса, отсюда и множество циклов) и получить нужно:
Пример вывода:
Найдено: Организаций - 5; Адресов - 10.
А ниже таблица с этими организациями и адресами.
Мне кажется фирму с разными адресами вы представляете как одну сущность, если избавиться от этого, то это -1 цикл запросов.
1 запрос должен выбрать количество фирм удовлетворяющих условию выборки (я так понимаю это Ваш первый запрос, хотя лично мне он не очень нравиться)
2 запрос должен выбрать все адреса всех фирм полученных в результате первого запроса
(если не ошибаюсь, то у вас тут цикл, а от него как раз нужно избавиться)
какие поля у вас проиндексированы?
если я правильно понял, то выборка происходит по определенным рубрикам, а в сводной таблице нужно указать фирмы, города, адреса и все рубрики в которых присутствует фирма, так? | |
|
|
|
|
|
|
|
для: Valick
(30.11.2009 в 09:31)
| | Здраствуйте, не могли бы сказать хотя бы в чем ошибка спроектированной базы, что бы вы изменили?
Поясните пожалуйста, что Вы имеете в виду по поводу фирмы с разными адресами представленная как одна сущность и как можно от этого избавиться?
Вы правильно поняли по поводу сводной таблицы. Там идет, фирма, затем все адреса, где она расположена, затем все рубрики, и город, который у фирмы одни. Т.е она может расплагаться на разных улицах, но в пределах одного города. | |
|
|
|
|
|
|
|
для: 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)
|
| |
|
|
|
|
|
|
|
для: Valick
(02.12.2009 в 15:14)
| | firms.city_id я бы убрал.
а firms.address_id - добавил бы.
А еще определился бы с таблицей streets .
Перенос поля city_id из streets в address допустим лишь в том случае, если таблица streets описывает названия улиц. Если она описывает сами улицы - поле нужно оставить в этой таблице. | |
|
|
|
|
|
|
|
для: Trianon
(02.12.2009 в 15:39)
| | а firms.address_id - добавил бы.
а зачем? если одна фирма имеет много адресов? (и не факт что в одном городе, пусть даже автору сегодня требуется фирма в пределах города, но кто знает что будет завтра) В этой таблице жёстко задано соответствие фирмы определенному идентификатору, что бы в таблице f_address отличать фирмы друг от друга, даже если они имеют одинаковые названия.
Собственно говоря таблица f_address - это и есть сущность фирмы, просто не стал переименовывать
Так же и для улиц, в моем случае это всего лишь названия... для конкретизации, я ввел бы еще одну таблицу
плохо что автор указал укороченные таблицы | |
|
|
|
|
|
|
|
для: Valick
(02.12.2009 в 18:21)
| | >а firms.address_id - добавил бы.
>а зачем? если одна фирма имеет много адресов?
Юридический - один.
Конечно, он никак не связан с территориями филиалов.
>Так же и для улиц, в моем случае это всего лишь названия...
То в Вашем. | |
|
|
|
|
|
|
|
для: Trianon
(02.12.2009 в 19:15)
| | Так и не понял, согласились Вы со мной или нет по первому пункту..
Допустим есть две фирмы
1) "Василиса" - организация детских праздников и дней рождения.
2) "Василиса" - досуг, эскорт услуги.
Как вы отличите их друг от друга в (не)вашей таблице? (id | firm_id | addres_firm_id)
по второму пункту достаточно одной таблетки новой таблицы со связями городов и улиц | |
|
|
|
|
|
|
|
для: Valick
(02.12.2009 в 20:35)
| | В смысле?
>Так и не понял, согласились Вы со мной или нет по первому пункту..
>Допустим есть две фирмы
>1) "Василиса" - организация детских праздников и дней рождения.
>2) "Василиса" - досуг, эскорт услуги.
>Как вы отличите их друг от друга в (не)вашей таблице? (id | firm_id | addres_firm_id)
(id | firm_id | addres_firm_id) - это запись в какой таблице? Таблицы с такими полями я не узрел ни у Вас, ни у меня, ни у автора. | |
|
|
|
|
|
|
|
для: Trianon
(03.12.2009 в 01:48)
| | ошибся немного
речь о таблице firms (firm_id | name | addres_id)
вопрос тот же. | |
|
|
|
|
|
|
|
для: Valick
(03.12.2009 в 09:54)
| | там, очевидно, будут еще какие-то поля, как минимум description
ну и заполнение, к примеру
(12, 'Василиса', 7, 'организация детских праздников и дней рождения'),
(35, 'Василиса', 82, 'досуг, эскорт услуги'),
На поле name ставится обычный, неуникальный индекс.
Точно также как с ФИО персоны в таблицах с любыми персональными данными.
Важно, кстати, не description.
Важно firms.firm_id
Потому что оно не firm_names.firmname_id | |
|
|
|
|
|
|
|
для: Trianon
(03.12.2009 в 12:25)
| | я не против каких-то там полей как таковых, я против полей которые мешают 3-му уровню нормализации, и если я все таки не ошибаюсь, то description как раз такое поле, так как оно не зависит от первичного ключа.
Да и как сами Вы говорите что description неважно, абсолютно с Вами согласен, потому-то в моей таблице его и нет, так как первичный ключ справляется с задачей и без "помощников"
____
опять неправильно сказал... description зависит от имени (или наоборот), а этого в 3 нормальной форме быть не должно. | |
|
|
|
|
|
|
|
для: Valick
(03.12.2009 в 14:34)
| | Я не вижу зависимости описания от имени. Можете пояснить?
Зависимость от сущности вижу - и это естественно.
Зависимости от имени - не вижу. | |
|
|
|
|
|
|
|
для: Trianon
(03.12.2009 в 17:31)
| | конечно могу :)
(12, 'Василиса', 7, 'организация детских праздников') - 1 филиал компании 7
(17, 'Василиса', 7, 'организация дней рождения') - 2 филиал компании 7
(35, 'Василиса', 82, 'досуг, эскорт услуги'), - 1 филиал компании 82
в итоге поле name (Василиса) зависит от поля description (7) | |
|
|
|
|
|
|
|
для: Valick
(03.12.2009 в 17:52)
| | стоп.
12 и 17 - это две разные органицации или одна и та же?
семерка - это не идентификатор компании. Это лишь чужой ключ в таблицу адресов.
Две организации могут именть одно и то же название (хотя маловероятно, что они будут при этом зарегистрированы по одному адресу.)
Но если это одна организация - то и строка у нее должна быть одна. | |
|
|
|
|
|
|
|
для: 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 разделить это на две таблицы адреса и филиалы.... но надо ли это.. вопрос спорный | |
|
|
|
|
|
|
|
для: Valick
(03.12.2009 в 18:07)
| | >Ну вот)) 12 и 17 получается одна компания
тогда не будет двух строк в таблице. И двух первичных ключей тоже не будет. | |
|
|
|
|
 7.9 Кб |
|
|
для: Rustamich
(01.12.2009 в 07:15)
| | Вы так и не ответили на каких полях у Вас индексы.
Вот я тут набросал немного кода посмотрите, в частности как реализована зебра. | |
|
|
|
|
|
|
|
для: 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 в одну, ведь по сути это одна сущность, или это не так? | |
|
|
|
|
|
|
|
для: 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 там где он ни в п. ни в к.а. | |
|
|
|
|
|
|
|
для: Trianon
(14.12.2009 в 12:18)
| | Ну допустим у меня рубрики и подрубрики это одна сущность. Почему Область и город не могут быть тоже одной сущность? | |
|
|
|
|
|
|
|
для: Rustamich
(14.12.2009 в 12:27)
| | И как будет называться эта сущность? | |
|
|
|
|
|
|
|
для: Trianon
(14.12.2009 в 12:34)
| | география к пример. | |
|
|
|
|
|
|
|
для: Rustamich
(14.12.2009 в 13:00)
| | Тогда - конечно.
Только будет ли она полезна Вам без опоры на физические сущности? | |
|
|
|
|
|
|
|
для: Trianon
(14.12.2009 в 13:03)
| | Нет, я, конечно, за отдельные сущности в данном вопросе, просто у всех разные мысли на этот счет, поэтому я и спросил. Благодарю за ответ! | |
|
|
|