Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выборка из двух таблиц. Вопрос по оптимизации

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
puta
Отправлено: 15 Ноября, 2011 - 20:25:26
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Добрый день. Есть 2 таблицы:

первая - хранит перечень заказов, у каждого заказа - айдишник записи в которой хранится информации абонента
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `request` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `id_apartment` int(11) NOT NULL,
  4.  
  5.   PRIMARY KEY (`id`),
  6. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;


вторая таблица хранит информацию об абоненте


CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `sp_apartment` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `number` varchar(10) NOT NULL,
  4.   `FIO` varchar(50) DEFAULT NULL,
  5.   `city` varchar(50) DEFAULT NULL,
  6.   PRIMARY KEY (`id`),
  7. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;


Задача состоит в выводе списка следующего формата:
Город
--- номер заказа, фио, адрес
--- номер заказа, фио, адрес
Город
....
и т.д.

Сейчас я делаю так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT r.id_apartment,a.number,a.FIO,a.city FROM `request` r LEFT JOIN `v_apartment` a ON r.id_apartment = a.id ORDER BY a.city


И соответственно уже в скрипте во время вывода смотрю на изменение города и там применяю соответствующий стиль для строки, если город на предыдущем шаге был такой же то вывожу просто строку с инфой о заказе, а если город новый то сначала вывожу его название а потом строку с инфой.

Можно ли как-то сгруппировать выборку по городам и избавиться от лишних телодвижений в цикле или же оптимизировать данный запрос?
 
 Top
mik_name
Отправлено: 15 Ноября, 2011 - 23:25:44
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Нояб. 2011  


Помог: 1 раз(а)




Первым запросом через distinct получаешь названия городов из таблицы абонентов, потом в цикле делаешь свой вышеприведенный запрос для каждого города с условием where a.city= $city делая какую угодно шапку и оформление вывода.

(Отредактировано автором: 15 Ноября, 2011 - 23:26:46)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Ноября, 2011 - 07:24:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




mik_name, худший вариант, к чему этот шквал запросов?

puta пишет:
И соответственно уже в скрипте во время вывода смотрю на изменение города и там применяю соответствующий стиль для строки, если город на предыдущем шаге был такой же то вывожу просто строку с инфой о заказе, а если город новый то сначала вывожу его название а потом строку с инфой.

Именно так эта задача и решается.
Можно так же результат выборки складывать в массив[ город ][ заказы ] и потом выводить парой вложенных foreach.

Кстати, для чего объединение по left join? Города может не быть?


-----
PostgreSQL DBA
 
 Top
puta
Отправлено: 16 Ноября, 2011 - 08:01:04
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




[quote=Мелкий][/quote]
да, могут попадаться и такие случаи
 
 Top
Самогонщик
Отправлено: 16 Ноября, 2011 - 08:06:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




Хм, а города без заказов?
 
 Top
puta
Отправлено: 16 Ноября, 2011 - 08:06:28
Post Id


Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




[quote=Самогонщик][/quote]
да, конечно )
 
 Top
Самогонщик
Отправлено: 16 Ноября, 2011 - 08:35:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




http://www.javenue.info/post/20 пишет:
Full outer join (ключевое слово outer можно опустить) необходим для отображения всех возможных комбинаций строк из нескольких таблиц. �?ными словами, это объединение результатов left и right join.


Зависит от задачи, но если нужно выводить и города без заказов, может пригодиться.
 
 Top
Stierus Супермодератор
Отправлено: 16 Ноября, 2011 - 21:53:56
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




так оно и делается, только на столбец id_apartment ключ повесь что бы join по ключу был. Ну и LEFT JOIN заменить на INNER JOIN что бы заказы на людей, по тем или иным причинам пропавшим из базы, не выводились.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB