Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Есть две базы на 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.
Думал составить как-то так:
Неактивен
Неактивен
В случае если делать с двумя селектами запрос будет такой, т.к. не вижу другого способа связать улицы
Неактивен
Сделал с двумя селектами. Тогда выбираю сначала район, заполняю улицами второй селект, выбираю улицу и записи выбираются. Но если выбран только район без улицы - пусто. Тогда составил запрос на этот случай, составил строку в цикле и вот такой запрос выходит:
Неактивен
А полнотекстовый индекс Вы почему использовать не хотите?
Неактивен
Если бы знал как - использовал бы.
Подскажите, что можно сделать?
Какие поля связать в индексе?
Отредактированно seyfer (14.12.2011 10:50:21)
Неактивен
А почему в Вашем запросе не задано условие соединения таблиц debtors, rayon ?
Неактивен
Используйте MATCH вместо LIKE '%..%' — и заработает, в чем проблема?
Неактивен
ita написал:
А почему в Вашем запросе не задано условие соединения таблиц debtors, rayon ?
Как? Единственное, что их соединяет это улицы, а они хранятся по разному! Тут только поиском улицы из rayon в debtors можно соединить.
Неактивен
paulus написал:
Используйте MATCH вместо LIKE '%..%' — и заработает, в чем проблема?
WHERE MATCH(actual_address) AGAINST (streets IN BOOLEAN MODE)
Не пробовал так. Если в лайке не подставляет значение, тут будет? И можно ли будет использовать *
AGAINST ('streets*' IN BOOLEAN MODE) например.
Неактивен
Неактивен
Ну, да, у Вас же нет слова «street», есть слово «парашютная».
Неактивен
paulus написал:
Ну, да, у Вас же нет слова «street», есть слово «парашютная».
Вы видимо не поняли задачу. При чем тут одна улица района? Мне надо все улицы района и все зписи из дебторс с улицами по этому району.
Видимо иначе как я сделал никак.
Или просто MATCH быстрее работает?
Если да, то мне нужно будет просто построить в цикле запрос вместо LIKE - MATCH и он не станет от этого меньше.
Отредактированно seyfer (16.12.2011 06:24:51)
Неактивен
Хм, действительно проглядел. Ну тогда JOIN действительно.
Неактивен
paulus написал:
Хм, действительно проглядел. Ну тогда JOIN действительно.
Мне не совсем понятна логика JOIN. Вот в прошлой теме мне подсказали.
http://sqlinfo.ru/forum/viewtopic.php?id=5073
Прошу и теперь помочь. Если не дать похожий запрос, то наводку куда копать.
Мне нужен этот запрос уже сейчас, после буду изучать MySQL глубоко и крепко.
Неактивен
Примерно хоть покажите как оно будет выглядеть с JOIN, я отредактирую правильно.
Неактивен
Честно скажу, глубоко не вникал, но сдается мне, что Вам нужно что-то такое:
Неактивен
LazY написал:
Честно скажу, глубоко не вникал, но сдается мне, что Вам нужно что-то такое:
...
FROM debtors d
JOIN rayon r ON d.actual_address LIKE CONCAT('%', r.street, '%')
...
В итоге после внедрения в мой запрос вышло что-то такое....
Отредактированно seyfer (23.12.2011 10:21:52)
Неактивен
Методом тыка составил такой запрос, который хотя бы не убивает mysql
но он не выдает никаких записей
Отредактированно seyfer (23.12.2011 10:35:24)
Неактивен
Получается запрос должен выбирать улицы по району как-то при помощи
Неактивен
Отредактированно seyfer (28.12.2011 13:47:40)
Неактивен
У меня есть ощущение, что Вы делаете слишком много самообъединений.
Давайте попробуем с самого начала, прочитать и понять Ваш последний
запрос я совсем не могу.
У Вас есть две таблицы со структурой из первого сообщения. Вам нужно
найти... (дальше из первого сообщения не понятно, что же Вам нужно найти).
Неактивен
Объясняю еще раз.
Есть две базы:
1. debtors с полем адреса, где улица представлена в виде "Ноября 77-88". Так же есть поле house отдельно с номером дома.
2. rayon со списком улиц, домов на улице и ид района. Улицы в виде "УЛИЦА АКАДЕМИКА НОЯБРЯ".
Есть приложение, где есть выборка из debtors. Основной запрос без фильтров такой:
Неактивен
Аха, кажется, понял. У Вас неудачная табличка районов, из-за этого ничего
не работает. Хороший запрос так не напишешь. Добавьте в debtors поле с
id района, и заполните его один раз долгим запросом?
Неактивен
Дело в том, что debtors как раз таки основная база, она выгружается скриптом из биллинга и ее поля строго определены. Я не могу ее никак менять. Можно менять другие, добавлять, но не debtors. В биллинге нету поля район.
Так что если есть какие-то идеи, то это к базе rayon или другим вспомогательным.
Неактивен