Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выбор населенного пункта со всеми предками 
:(
    Опции темы
gulitskiy
Дата 25.9.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Есть база, в ней хранятся область, район, населенный пункт.

Код

CREATE TABLE IF NOT EXISTS `places` (
    `id` SERIAL,
    `pid` BIGINT UNSIGNED DEFAULT NULL,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY (`id`),
    FOREIGN KEY (`pid`)
    REFERENCES `places`(`id`)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


Код

INSERT INTO `places` (`pid`, `name`, `zip`, `country`) VALUES
    (NULL, 'Первая область', NULL, 'KZ'),
        (1, 'Первый район', NULL, 'KZ'),
        (1, 'Второй район', NULL, 'KZ'),
        (1, 'Третий район', NULL, 'KZ'),
            (4, 'Поселок один', '020801', 'KZ'),
            (4, 'Поселок 2', '020800', 'KZ'),
        (1, 'четвертый район район', NULL, 'KZ'),
        (1, 'город 1', NULL, 'KZ');


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

область район поселок
область город нулл

и тд

PM MAIL   Вверх
Akina
Дата 25.9.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Курите маны по "nested set"


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
gulitskiy
Дата 25.9.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Цитата(Akina @ 25.9.2012,  14:26)
Курите маны по "nested set"

спасибо про нестед сет я знаю

возможно ли это с ним?
допустим есть город Станция и деревня Станция
у города есть только один предок область а у деревни 2 район и область

я делаю запрос селект where name like "Стан%"

и мне надо что он выдал 3 столбика

область район поселок станция
область город станция

естественно можно в обратном порядке ну или уже готовую строку кокатом
PM MAIL   Вверх
tzirechnoy
Дата 25.9.2012, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Я думаю, через LEFT OUTER JOIN лучшэ всего обойтись.
PM MAIL   Вверх
gulitskiy
Дата 26.9.2012, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Цитата(tzirechnoy @ 25.9.2012,  18:54)
Я думаю, через LEFT OUTER JOIN лучшэ всего обойтись.

за оутер спасибо

теперь вот что получается

строю запрос

Код

select CONCAT(
    IF(p1.name IS NOT NULL, p1.name, ''),
    IF(p2.name IS NOT NULL, CONCAT(', ', p2.name), ''),
    IF(p3.name IS NOT NULL, CONCAT(', ', p3.name), '')) as place
    from `places` as p1
        left outer join `places` as p2 on p1.id = p2.pid
        left outer join `places` as p3 on p2.id = p3.pid
        where p3.name like 'Аста%' or p2.name like 'Аста%';


он выдает

Акмолинская область, Астана

строю другой запрос

Код

select CONCAT(
    IF(p1.name IS NOT NULL, p1.name, ''),
    IF(p2.name IS NOT NULL, CONCAT(', ', p2.name), ''),
    IF(p3.name IS NOT NULL, CONCAT(', ', p3.name), '')) as place
    from `places` as p1
        left outer join `places` as p2 on p1.id = p2.pid
        left outer join `places` as p3 on p2.id = p3.pid
        where p3.name like 'Ново%' or p2.name like 'Ново%';


и он выдает


Акмолинская область, Ерейментауский район, Новодолинка
Акмолинская область, Ерейментауский район, Новомарковка
Ерейментауский район, Новодолинка
Ерейментауский район, Новомарковка


то есть данные дублируются

Это сообщение отредактировал(а) gulitskiy - 26.9.2012, 07:34
PM MAIL   Вверх
Akina
Дата 26.9.2012, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(gulitskiy @  26.9.2012,  08:33 Найти цитируемый пост)
за оутер спасибо

Судя по синтаксису, это MySQL. В нём LEFT JOIN и LEFT OUTER JOIN - полные синонимы.
Цитата(gulitskiy @  26.9.2012,  08:33 Найти цитируемый пост)
теперь вот что получается

У Вас структура кривая - нет возможности определить, является ли запись областью, районом, нас. пунктом или иным объектом.
Введите, что ли, проверку, что элемент в копии таблицы p1 является в свойм дереве корневым (потребуется четвёртая копия таблицы в запросе).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
gulitskiy
Дата 26.9.2012, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Цитата(Akina @  26.9.2012,  07:42 Найти цитируемый пост)
У Вас структура кривая 


понятно, а как можно сделать не кривую структупу

как понимаю, енум типа область, район, нас пункт?
PM MAIL   Вверх
Akina
Дата 26.9.2012, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Как вариант...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.