SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.12.2011 07:33:17

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Возможно ли составить такой запрос?

Добрый день.

Есть две базы на 5000 и 20000 записей:

--
-- Table structure for table `debtors`
--

CREATE TABLE IF NOT EXISTS `debtors` (
  `users_id` int(11) NOT NULL DEFAULT '0',
  `full_name` varchar(255) NOT NULL,
  `actual_address` varchar(255) NOT NULL,
  `building` varchar(15) NOT NULL,
  `flat_number` varchar(15) NOT NULL,
  `work_telephone` varchar(100) NOT NULL,
  `home_telephone` varchar(100) NOT NULL,
  `mobile_telephone` varchar(100) NOT NULL,
  `balance` float NOT NULL DEFAULT '0',
  `credit` float NOT NULL DEFAULT '0',
  `services` varchar(255) NOT NULL,
  `tariff_name` varchar(120) NOT NULL DEFAULT ' ',
  `account_id` int(11) NOT NULL DEFAULT '0',
  `block_start_date` int(11) NOT NULL DEFAULT '0',
  `is_juridical` int(11) NOT NULL DEFAULT '0',
  KEY `users_id` (`users_id`),
  KEY `users_id__is_juridical` (`users_id`,`is_juridical`),
  KEY `is_juridical__block_start_date` (`is_juridical`,`block_start_date`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- --------------------------------------------------------

--
-- Table structure for table `rayon`
--

CREATE TABLE IF NOT EXISTS `rayon` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `street` varchar(255) NOT NULL,
  `area_id` int(5) NOT NULL,
  `house` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=21984 ;

Мне надо выбрать только те записи из дебторс, где район ид равен выбранному, дом в дебторс равен дому в районе.
area_id = 1 AND house = building

И главное - улицы из базы район, которые похожи/входят в адреса дебторов. Базы не нормализованны, так что адреса отличаются, но в базе района они только строкой, например Ленина, а в адресах дебторов с домом и квартирой, например Ленина 77-22.

Думал составить как-то так:

SELECT debtors.*, FROM_UNIXTIME(block_start_date) AS date
            FROM debtors, rayon
            WHERE area_id = 1 AND house = building
            AND actual_address LIKE '%street%'
        ORDER BY date DESC


Но в street не подставляет значение, и в итоге выбирается 0 записей. Если сам подставляю Ленина, то находит записи.

Хотелось бы обойтись без php и циклов.
Возможно?

Неактивен

 

#2 13.12.2011 08:54:03

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

SELECT DISTINCT debtors.*, FROM_UNIXTIME(block_start_date) AS date
            FROM debtors, rayon, area
            WHERE area.id = 2 AND house = building
            AND actual_address LIKE '%мира%' AND area_id = area.id
        ORDER BY date DESC


Так выдает все Мира с домами 3 из Дебторс и второй район.

Район выбирается в приложении по селекту. Есть вариант сделать два селекта Район - Улица и второй заполнять динамически, но хотелось бы по одному району выбирать.

Неактивен

 

#3 13.12.2011 09:05:23

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

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

SELECT DISTINCT * , FROM_UNIXTIME( block_start_date ) AS DATE
FROM debtors, rayon, area
WHERE area.id =2
AND house = building
AND actual_address LIKE  '%мира%'
AND area_id = area.id
AND street LIKE  '%мира%'
ORDER BY DATE DESC
LIMIT 0 , 30


НО!

Улица Мира есть в районе 2 с адресами Мира 3-116 и Мира 3-81, они соответствуют улице МИРА в базе rayon попадают в выборку.
Выбираю район 3, в базе rayon улица АДМИРАЛА МАКАРОВА и дом номер 3, попадают в выборку эти же 2 адреса (Мира 3-116 и Мира 3-81).

Неактивен

 

#4 13.12.2011 10:51:32

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

Сделал с двумя селектами. Тогда выбираю сначала район, заполняю улицами второй селект, выбираю улицу и записи выбираются. Но если выбран только район без улицы - пусто. Тогда составил запрос на этот случай, составил строку в цикле и вот такой запрос выходит:


SELECT DISTINCT debtors.*, FROM_UNIXTIME(block_start_date) AS date FROM debtors, rayon, area WHERE area.id = 2 AND house = building AND area_id = area.id AND ( actual_address LIKE '%СТАДИОННАЯ%' OR actual_address LIKE '%БРАТСКАЯ%' OR actual_address LIKE '%СИБИРСКАЯ%' OR actual_address LIKE '%САЯНСКАЯ%' OR actual_address LIKE '%МОЛОДОСТИ%' OR actual_address LIKE '%КОНЕЧНАЯ%' OR actual_address LIKE '%ПРОЕКТНАЯ%' OR actual_address LIKE '%УКРАИНСКАЯ%' OR actual_address LIKE '%КАРАМЗИНА%' OR actual_address LIKE '%ГЛИНЯНАЯ%' OR actual_address LIKE '%КОЛХОЗНАЯ%' OR actual_address LIKE '%ЭЛЕКТРИКОВ%' OR actual_address LIKE '%ЭКСКУРСАНТОВ%' OR actual_address LIKE '%ШИФЕРНИКОВ%' OR actual_address LIKE '%УРАЛЬСКИЙ%' OR actual_address LIKE '%СТРЕЛОЧНАЯ%' OR actual_address LIKE '%СЕМАФОРНАЯ%' OR actual_address LIKE '%СЕЛЬСКАЯ%' OR actual_address LIKE '%СВЕРДЛОВСКАЯ%' OR actual_address LIKE '%ТУРГЕНЕВА%' OR actual_address LIKE '%СКЛАДСКАЯ%' OR actual_address LIKE '%МЕБЕЛЬНАЯ%' OR actual_address LIKE '%ЗАТОНСКАЯ%' OR actual_address LIKE '%КОРОЛЕВА%' OR actual_address LIKE '%КОЛЬЦЕВАЯ%' OR actual_address LIKE '%ЛЕСНИКОВ%' OR actual_address LIKE '%ТИМОШЕНКОВА АЛЕШИ%' OR actual_address LIKE '%РОЩЕВАЯ%' OR actual_address LIKE '%ПРИБОЙНАЯ%' OR actual_address LIKE '%ДЕПУТАТСКАЯ%' OR actual_address LIKE '%ГИПСОВАЯ 3-Я%' OR actual_address LIKE '%ГИПСОВАЯ%' OR actual_address LIKE '%ВЕСЕЛАЯ%' OR actual_address LIKE '%ВАВИЛОВА%' OR actual_address LIKE '%БОЙКАЯ%' OR actual_address LIKE '%БОДРАЯ%' OR actual_address LIKE '%60 ЛЕТ ОКТЯБРЯ%' OR actual_address LIKE '%СУДОСТРОИТЕЛЬНАЯ%' OR actual_address LIKE '%СПЛАВУЧАСТОК%' OR actual_address LIKE '%ЦЕМЕНТНИКОВ%' OR actual_address LIKE '%ТУРИСТСКАЯ%' OR actual_address LIKE '%ОДНОСТОРОННИЙ%' OR actual_address LIKE '%МОСТОВИКОВ%' OR actual_address LIKE '%МАКАРОВА АДМИРАЛА%' OR actual_address LIKE '%КООПЕРАТИВНАЯ%' OR actual_address LIKE '%СОЛОНЦОВАЯ%' OR actual_address LIKE '%ПАРАШЮТНАЯ%' OR actual_address LIKE '%ОРЛОВСКАЯ%' OR actual_address LIKE '%МУСОРГСКОГО%' OR actual_address LIKE '%ЛЕСОПЕРЕВАЛОЧНАЯ%' OR actual_address LIKE '%КОМБАЙНЕРОВ%' OR actual_address LIKE '%КИРПИЧНИКОВ%' OR actual_address LIKE '%КАМЕННАЯ%' OR actual_address LIKE '%ДЕЛЕГАТСКАЯ%' OR actual_address LIKE '%ГРАФИТНАЯ%' OR actual_address LIKE '%ГРАНИТНАЯ%' OR actual_address LIKE '%ГЛАДКОВА АНАТОЛИЯ%' OR actual_address LIKE '%АФОНТОВСКИЙ%' OR actual_address LIKE '%ФАБРИЧНАЯ%' OR actual_address LIKE '%УЗКИЙ%' OR actual_address LIKE '%МОТОРНАЯ%' OR actual_address LIKE '%МПС%' OR actual_address LIKE '%ТОРГАШИНСКАЯ%' OR actual_address LIKE '%РЕЧНИКОВ%' OR actual_address LIKE '%МЕДИЦИНСКИЙ%' OR actual_address LIKE '%ДРУЖБЫ%' OR actual_address LIKE '%КОРАБЕЛЬНАЯ%' OR actual_address LIKE '%ИЗЫСКАТЕЛЬСКИЙ%' OR actual_address LIKE '%ВОДОМЕТНЫЙ%' OR actual_address LIKE '%ВЕРХОЯНСКИЙ%' OR actual_address LIKE '%ВАСНЕЦОВА%' OR actual_address LIKE '%СТРОИТЕЛЬНАЯ%' OR actual_address LIKE '%ПОЛТАВСКАЯ%' OR actual_address LIKE '%ПОДЪЕМНАЯ%' OR actual_address LIKE '%ПОБЕЖИМОВА%' OR actual_address LIKE '%НОВАТОРСКАЯ%' OR actual_address LIKE '%МАТРОСОВА АЛЕКСАНДРА%' OR actual_address LIKE '%ЛЕТЧИКОВ%' OR actual_address LIKE '%ЛЕСОПИЛЬЩИКОВ%' OR actual_address LIKE '%КРИВОКОЛЕННЫЙ%' OR actual_address LIKE '%КРАСНОЯРСКИЙ РАБОЧИЙ ИМ. ГАЗЕТЫ%' OR actual_address LIKE '%КРАСНОПРЕСНЕНСКАЯ%' OR actual_address LIKE '%КОНСТРУКТОРОВ%' OR actual_address LIKE '%КЛЮЧЕВСКАЯ%' OR actual_address LIKE '%КЛИНКЕРНАЯ%' OR actual_address LIKE '%ПОДГОРНАЯ%' OR actual_address LIKE '%ПЛАНОВАЯ%' OR actual_address LIKE '%ЛАЛЕТИНО%' OR actual_address LIKE '%ТОРГОВАЯ%' OR actual_address LIKE '%КАНСКАЯ%' OR actual_address LIKE '%ЮЖНАЯ%' OR actual_address LIKE '%ПРОМЫШЛЕННЫЙ%' OR actual_address LIKE '%ФИГУРНАЯ%' OR actual_address LIKE '%ЛИТЕЙНАЯ%' OR actual_address LIKE '%БОРОВАЯ%' OR actual_address LIKE '%БАЗАРНАЯ%' OR actual_address LIKE '%БАЗАЙСКАЯ%' OR actual_address LIKE '%КАРЬЕРНАЯ%' OR actual_address LIKE '%КАШТАЧНАЯ%' OR actual_address LIKE '%КВАДРАТНЫЙ%' ) AND ( street LIKE '%СТАДИОННАЯ%' OR street LIKE '%БРАТСКАЯ%' OR street LIKE '%СИБИРСКАЯ%' OR street LIKE '%САЯНСКАЯ%' OR street LIKE '%МОЛОДОСТИ%' OR street LIKE '%КОНЕЧНАЯ%' OR street LIKE '%ПРОЕКТНАЯ%' OR street LIKE '%УКРАИНСКАЯ%' OR street LIKE '%КАРАМЗИНА%' OR street LIKE '%ГЛИНЯНАЯ%' OR street LIKE '%КОЛХОЗНАЯ%' OR street LIKE '%ЭЛЕКТРИКОВ%' OR street LIKE '%ЭКСКУРСАНТОВ%' OR street LIKE '%ШИФЕРНИКОВ%' OR street LIKE '%УРАЛЬСКИЙ%' OR street LIKE '%СТРЕЛОЧНАЯ%' OR street LIKE '%СЕМАФОРНАЯ%' OR street LIKE '%СЕЛЬСКАЯ%' OR street LIKE '%СВЕРДЛОВСКАЯ%' OR street LIKE '%ТУРГЕНЕВА%' OR street LIKE '%СКЛАДСКАЯ%' OR street LIKE '%МЕБЕЛЬНАЯ%' OR street LIKE '%ЗАТОНСКАЯ%' OR street LIKE '%КОРОЛЕВА%' OR street LIKE '%КОЛЬЦЕВАЯ%' OR street LIKE '%ЛЕСНИКОВ%' OR street LIKE '%ТИМОШЕНКОВА АЛЕШИ%' OR street LIKE '%РОЩЕВАЯ%' OR street LIKE '%ПРИБОЙНАЯ%' OR street LIKE '%ДЕПУТАТСКАЯ%' OR street LIKE '%ГИПСОВАЯ 3-Я%' OR street LIKE '%ГИПСОВАЯ%' OR street LIKE '%ВЕСЕЛАЯ%' OR street LIKE '%ВАВИЛОВА%' OR street LIKE '%БОЙКАЯ%' OR street LIKE '%БОДРАЯ%' OR street LIKE '%60 ЛЕТ ОКТЯБРЯ%' OR street LIKE '%СУДОСТРОИТЕЛЬНАЯ%' OR street LIKE '%СПЛАВУЧАСТОК%' OR street LIKE '%ЦЕМЕНТНИКОВ%' OR street LIKE '%ТУРИСТСКАЯ%' OR street LIKE '%ОДНОСТОРОННИЙ%' OR street LIKE '%МОСТОВИКОВ%' OR street LIKE '%МАКАРОВА АДМИРАЛА%' OR street LIKE '%КООПЕРАТИВНАЯ%' OR street LIKE '%СОЛОНЦОВАЯ%' OR street LIKE '%ПАРАШЮТНАЯ%' OR street LIKE '%ОРЛОВСКАЯ%' OR street LIKE '%МУСОРГСКОГО%' OR street LIKE '%ЛЕСОПЕРЕВАЛОЧНАЯ%' OR street LIKE '%КОМБАЙНЕРОВ%' OR street LIKE '%КИРПИЧНИКОВ%' OR street LIKE '%КАМЕННАЯ%' OR street LIKE '%ДЕЛЕГАТСКАЯ%' OR street LIKE '%ГРАФИТНАЯ%' OR street LIKE '%ГРАНИТНАЯ%' OR street LIKE '%ГЛАДКОВА АНАТОЛИЯ%' OR street LIKE '%АФОНТОВСКИЙ%' OR street LIKE '%ФАБРИЧНАЯ%' OR street LIKE '%УЗКИЙ%' OR street LIKE '%МОТОРНАЯ%' OR street LIKE '%МПС%' OR street LIKE '%ТОРГАШИНСКАЯ%' OR street LIKE '%РЕЧНИКОВ%' OR street LIKE '%МЕДИЦИНСКИЙ%' OR street LIKE '%ДРУЖБЫ%' OR street LIKE '%КОРАБЕЛЬНАЯ%' OR street LIKE '%ИЗЫСКАТЕЛЬСКИЙ%' OR street LIKE '%ВОДОМЕТНЫЙ%' OR street LIKE '%ВЕРХОЯНСКИЙ%' OR street LIKE '%ВАСНЕЦОВА%' OR street LIKE '%СТРОИТЕЛЬНАЯ%' OR street LIKE '%ПОЛТАВСКАЯ%' OR street LIKE '%ПОДЪЕМНАЯ%' OR street LIKE '%ПОБЕЖИМОВА%' OR street LIKE '%НОВАТОРСКАЯ%' OR street LIKE '%МАТРОСОВА АЛЕКСАНДРА%' OR street LIKE '%ЛЕТЧИКОВ%' OR street LIKE '%ЛЕСОПИЛЬЩИКОВ%' OR street LIKE '%КРИВОКОЛЕННЫЙ%' OR street LIKE '%КРАСНОЯРСКИЙ РАБОЧИЙ ИМ. ГАЗЕТЫ%' OR street LIKE '%КРАСНОПРЕСНЕНСКАЯ%' OR street LIKE '%КОНСТРУКТОРОВ%' OR street LIKE '%КЛЮЧЕВСКАЯ%' OR street LIKE '%КЛИНКЕРНАЯ%' OR street LIKE '%ПОДГОРНАЯ%' OR street LIKE '%ПЛАНОВАЯ%' OR street LIKE '%ЛАЛЕТИНО%' OR street LIKE '%ТОРГОВАЯ%' OR street LIKE '%КАНСКАЯ%' OR street LIKE '%ЮЖНАЯ%' OR street LIKE '%ПРОМЫШЛЕННЫЙ%' OR street LIKE '%ФИГУРНАЯ%' OR street LIKE '%ЛИТЕЙНАЯ%' OR street LIKE '%БОРОВАЯ%' OR street LIKE '%БАЗАРНАЯ%' OR street LIKE '%БАЗАЙСКАЯ%' OR street LIKE '%КАРЬЕРНАЯ%' OR street LIKE '%КАШТАЧНАЯ%' OR street LIKE '%КВАДРАТНЫЙ%' ) ORDER BY date DESC LIMIT 0, 20


Ужасно огромный, но работает. Действительно выбирает записи с улицами по району, только дооолго.
Для самого большого района Showing rows 0 - 19 (20 total, Query took 11.0257 sec).

Неужели нету больше вариантов?

Неактивен

 

#5 13.12.2011 16:42:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли составить такой запрос?

А полнотекстовый индекс Вы почему использовать не хотите?

Неактивен

 

#6 14.12.2011 04:56:17

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

Если бы знал как - использовал бы.

Подскажите, что можно сделать?

Какие поля связать в индексе?

Отредактированно seyfer (14.12.2011 10:50:21)

Неактивен

 

#7 14.12.2011 14:58:32

ita
Участник
Зарегистрирован: 24.09.2008
Сообщений: 19

Re: Возможно ли составить такой запрос?

А почему в Вашем  запросе не задано условие соединения таблиц debtors, rayon ?

Неактивен

 

#8 14.12.2011 19:23:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли составить такой запрос?

Используйте MATCH вместо LIKE '%..%' — и заработает, в чем проблема?

Неактивен

 

#9 15.12.2011 09:52:24

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

ita написал:

А почему в Вашем  запросе не задано условие соединения таблиц debtors, rayon ?

Как? Единственное, что их соединяет это улицы, а они хранятся по разному! Тут только поиском улицы из rayon в debtors можно соединить.

Неактивен

 

#10 15.12.2011 09:55:13

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

paulus написал:

Используйте MATCH вместо LIKE '%..%' — и заработает, в чем проблема?

WHERE MATCH(actual_address) AGAINST (streets IN BOOLEAN MODE)

Не пробовал так. Если в лайке не подставляет значение, тут будет? И можно ли будет использовать *
AGAINST ('streets*' IN BOOLEAN MODE) например.

Неактивен

 

#11 15.12.2011 10:31:25

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

ALTER TABLE  `debtors` ADD FULLTEXT (
`actual_address`
)


Далее

and MATCH(actual_address) AGAINST ('street*' IN BOOLEAN MODE)
and MATCH(actual_address) AGAINST (street IN BOOLEAN MODE)
and MATCH(actual_address) AGAINST ('street' IN BOOLEAN MODE)


не работает ничего

Неактивен

 

#12 15.12.2011 18:24:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли составить такой запрос?

Ну, да, у Вас же нет слова «street», есть слово «парашютная».

Неактивен

 

#13 16.12.2011 05:04:21

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

paulus написал:

Ну, да, у Вас же нет слова «street», есть слово «парашютная».

Вы видимо не поняли задачу. При чем тут одна улица района? Мне надо все улицы района и все зписи из дебторс с улицами по этому району.

Видимо иначе как я сделал никак.

Или просто MATCH быстрее работает?

Если да, то мне нужно будет просто построить в цикле запрос вместо LIKE - MATCH и он не станет от этого меньше. smile

Отредактированно seyfer (16.12.2011 06:24:51)

Неактивен

 

#14 16.12.2011 13:11:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли составить такой запрос?

Хм, действительно проглядел. Ну тогда JOIN действительно.

Неактивен

 

#15 16.12.2011 13:55:06

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

paulus написал:

Хм, действительно проглядел. Ну тогда JOIN действительно.

Мне не совсем понятна логика JOIN. Вот в прошлой теме мне подсказали.
http://sqlinfo.ru/forum/viewtopic.php?id=5073

Прошу и теперь помочь. Если не дать похожий запрос, то наводку куда копать.

Мне нужен этот запрос уже сейчас, после буду изучать MySQL глубоко и крепко.

Неактивен

 

#16 20.12.2011 05:07:00

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

Примерно хоть покажите как оно будет выглядеть с JOIN, я отредактирую правильно.

hmm

Неактивен

 

#17 21.12.2011 07:12:52

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Возможно ли составить такой запрос?

Честно скажу, глубоко не вникал, но сдается мне, что Вам нужно что-то такое:

...
FROM debtors d
JOIN rayon r ON d.actual_address LIKE CONCAT('%', r.street, '%')
...

Неактивен

 

#18 23.12.2011 10:20:47

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

LazY написал:

Честно скажу, глубоко не вникал, но сдается мне, что Вам нужно что-то такое:

...
FROM debtors d
JOIN rayon r ON d.actual_address LIKE CONCAT('%', r.street, '%')
...

В итоге после внедрения в мой запрос вышло что-то такое....

SELECT DISTINCT debtors.*, FROM_UNIXTIME(debtors.block_start_date) AS date
            FROM rayon, area, debtors d
JOIN rayon r ON d.actual_address LIKE CONCAT('%', r.street, '%'),
        debtors left join
        (
SELECT users_id
FROM debtors, complete, notes
WHERE block_start_date < compl_date
AND compl_note = note_id
AND n_abon_id = users_id
AND is_juridical =0
) t using(users_id) WHERE t.users_id IS NULL
AND area.id = $filter_ray AND rayon.house = debtors.building
          AND rayon.area_id = area.id            
        AND debtors.is_juridical = 0
        AND debtors.users_id NOT IN(SELECT DISTINCT users_id
FROM debtors, zanyat
WHERE metka = '1' AND id_abonenta = users_id AND id_operatora = '$id')
        ORDER BY {$_SESSION['sort']} {$sort_by}  
        LIMIT $start, $num"


после выполнения mysql подвисает.........

т.е. нагрузка на сервер подпрыгивает и запрос не завершается

Отредактированно seyfer (23.12.2011 10:21:52)

Неактивен

 

#19 23.12.2011 10:33:02

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

Методом тыка составил такой запрос, который хотя бы не убивает mysql
но он не выдает никаких записей


SELECT DISTINCT d.*, FROM_UNIXTIME(d.block_start_date) AS date
            FROM rayon, area, debtors d
        left join
        (
SELECT users_id, actual_address
FROM debtors, complete, notes
WHERE block_start_date < compl_date
AND compl_note = note_id
AND n_abon_id = users_id
AND is_juridical =0
) t using(users_id, actual_address)
JOIN rayon r ON t.actual_address LIKE CONCAT('%', r.street, '%')
        WHERE t.users_id IS NULL
AND area.id = $filter_ray AND rayon.house = d.building
          AND rayon.area_id = area.id            
        AND d.is_juridical = 0
        AND d.users_id NOT IN(SELECT DISTINCT users_id
FROM debtors, zanyat
WHERE metka = '1' AND id_abonenta = users_id AND id_operatora = '$id')
        ORDER BY {$_SESSION['sort']} {$sort_by}  
        LIMIT $start, $num
 


при замене t.actual_address на d.actual_address снова все виснет. В общем как-то надо собрать это в кучу и я не понимаю как.

Помогите...

Отредактированно seyfer (23.12.2011 10:35:24)

Неактивен

 

#20 23.12.2011 10:42:35

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

Получается запрос должен выбирать улицы по району как-то при помощи

FROM debtors d
JOIN rayon r ON d.actual_address LIKE CONCAT('%', r.street, '%')


вместо моих построенных в цикле
AND $str_ac
            AND $str_str


И содержать исключающую часть тоже
left join
        (
SELECT users_id
FROM debtors, complete, notes
WHERE block_start_date < compl_date
AND compl_note = note_id
AND n_abon_id = users_id
AND is_juridical =0
) t using(users_id) WHERE t.users_id IS NULL


это для меня слишком трудно sad

Выбрать надо улицы по району и только среди тех записей, где debtors.block_start_date < complete.compl_date.
Связь complete и debtors через notes.
По улицам - те улицы debtors.full_address, которые совпадают с улицами в rayon.street.

Неактивен

 

#21 28.12.2011 13:47:18

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?


SELECT DISTINCT d.*, FROM_UNIXTIME(d.block_start_date) AS date
          FROM rayon, area, debtors d
          JOIN rayon r ON d.actual_address LIKE CONCAT('%', r.street, '%')
          left join
          (
          SELECT users_id, actual_address
          FROM debtors, complete, notes
          WHERE block_start_date < compl_date
          AND compl_note = note_id
          AND n_abon_id = users_id
          AND is_juridical =0
          ) t using(users_id)          
          WHERE t.users_id IS NULL
          AND area.id = $filter_ray AND rayon.house = d.building
          AND rayon.area_id = area.id
          AND d.is_juridical = 0
          AND d.users_id NOT IN(SELECT DISTINCT users_id
          FROM debtors, zanyat
          WHERE metka = '1' AND id_abonenta = users_id AND id_operatora = '$id')
          ORDER BY {$_SESSION['sort']} {$sort_by}
          LIMIT $start, $num
 


а так все зависает.......

Отредактированно seyfer (28.12.2011 13:47:40)

Неактивен

 

#22 30.12.2011 21:28:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли составить такой запрос?

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

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

Неактивен

 

#23 03.01.2012 06:21:35

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

Объясняю еще раз.

Есть две базы:

1. debtors с полем адреса, где улица представлена в виде "Ноября 77-88". Так же есть поле house отдельно с номером дома.
2. rayon со списком улиц, домов на улице и ид района. Улицы в виде "УЛИЦА АКАДЕМИКА НОЯБРЯ".

Есть приложение, где есть выборка из debtors. Основной запрос без фильтров такой:


SELECT debtors . * , FROM_UNIXTIME( debtors . block_start_date ) AS DATE
FROM debtors left join
(
SELECT users_id
FROM debtors, complete, notes
WHERE block_start_date < compl_date
AND compl_note = note_id
AND n_abon_id = users_id
AND is_juridical =0
) t using(users_id) WHERE t.users_id IS NULL and
is_juridical =0
ORDER BY DATE DESC
LIMIT 0 , 20
 


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

Это реализовано у меня так, добавляется к базовому запросу выше:

area.id = $filter_ray AND house = building
                    AND actual_address LIKE '%НОЯБРЯ%'
                    AND street LIKE '%НОЯБРЯ%'
                    AND area_id = area.id
 


Т.е. я связываю debtors и rayon по номеру дома и выбираю улицы со словом НОЯБРЬ например. Улица выбирается в селекте и подставляется в php.

Что нужно сделать?

Нужно сделать такой фильтр, что бы выбирались все записи из debtors только по району, без выбора улицы.
Я это реализовал тупо перечислением всех улиц в районе в цикле PHP в виде LIKE '%УЛИЦА%' OR ... и подставляю это для поля адреса в debtors и rayon, по тому же принципу, как выбирается район-улица, только для всех улиц района.
Выходит очень громоздко и медленно работает на районах с большим кол-вом улиц.

Вопрос как сделать через JOIN или еще как-то красиво и быстро.

Неактивен

 

#24 03.01.2012 15:27:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Возможно ли составить такой запрос?

Аха, кажется, понял. У Вас неудачная табличка районов, из-за этого ничего
не работает. Хороший запрос так не напишешь. Добавьте в debtors поле с
id района, и заполните его один раз долгим запросом?

Неактивен

 

#25 04.01.2012 05:00:25

seyfer
Завсегдатай
Зарегистрирован: 11.12.2011
Сообщений: 30

Re: Возможно ли составить такой запрос?

Дело в том, что debtors как раз таки основная база, она выгружается скриптом из биллинга и ее поля строго определены. Я не могу ее никак менять. Можно менять другие, добавлять, но не debtors. В биллинге нету поля район.

Так что если есть какие-то идеи, то это к базе rayon или другим вспомогательным.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson