Здравствуйте, пытаюсь сделать выборку данных, но постоянно возвращает пустое значение. В чем ошибка?
SELECT shop.id FROM locality, shop
WHERE shop.locality_id=locality.id
and shop.company="M.Видео"
and shop.name="м. «Красносельская», ТЦ «Тройка»"
and shop.address="Москва, ул. Верхняя Красносельская вл. 3а, ТЦ «Тройка»"
and shop.locality_id=117929
and shop.class=1
Вот скриншот записи:
Другой запрос, запрос идет из 1 таблицы
SELECT shop.id FROM shop
WHERE shop.company="M.Видео"
and shop.name="м. «Красносельская», ТЦ «Тройка»"
and shop.address="Москва, ул. Верхняя Красносельская вл. 3а, ТЦ «Тройка»"
and shop.locality_id="117929"
and shop.class="1"
Даже можно вот так:
SELECT id FROM shop
WHERE company="M.Видео"
and name="м. «Красносельская», ТЦ «Тройка»"
and address="Москва, ул. Верхняя Красносельская вл. 3а, ТЦ «Тройка»"
and locality_id="117929"
and class="1"
Update Проблема в наличии невидимых символов: во время составления списка для добавления записи для имени длина составляет 34, а в бд приходил длиной 64
код:
print("Длина имени",len(name_shop))
print("Длина адреса",len(address_shop))
type="M.Видео"
sql = """SELECT shop.id FROM locality, shop WHERE shop.locality_id=locality.id and shop.company=%s and shop.name=%s and shop.address=%s and shop.locality_id=%s and shop.class=%s"""
data = [(type, name_shop, address_shop, city_id, '1')]
print(data)
shop_id=select_request_db(sql,data)
log.info("Выборка")
def select_request_db(sql, data):
conn = MySQLdb.connect(host="localhost", user="root", passwd="", db="project")
conn.set_character_set('utf8')
cursor = conn.cursor()
cursor.execute('SET NAMES utf8;')
cursor.execute('SET CHARACTER SET utf8;')
cursor.execute('SET character_set_connection=utf8;')
conn.autocommit(True)
cursor.executemany(sql,data)
row = cursor.fetchall()
conn.close()
list_id = list(sum(row, ()))
return list_id
Лог:
Длина имени 34
Длина адреса 55
ID города: 62494
[('M.Видео', 'Домодедово, ТРЦ «Торговый Квартал»', 'Домодедово, Каширское ш., д. 3А, ТРЦ «Торговый Квартал»', 62494, '1')]
В чем может быть проблема? использую python+mysqldb
Структура таблицы:
Добрый день.
В таком варианте запрос работает:
CREATE TABLE `shop` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`class` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`company` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`locality_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `shop` VALUES (1,'1','M.Видео','м. «Красносельская», ТЦ «Тройка»','Москва, ул. Верхняя Красносельская вл. 3а, ТЦ «Тройка»',117929);
SELECT * FROM shop
WHERE
company = "M.Видео"
AND name = "м. «Красносельская», ТЦ «Тройка»"
AND address = "Москва, ул. Верхняя Красносельская вл. 3а, ТЦ «Тройка»"
AND locality_id = "117929"
AND class = "1"
То, что не возвращает результатов из python скорее всего как-то связано с особенностями работы с кодировками. Из-за этого и длина поля может быть разной если смотреть средствами python.
Хочется ещё сказать насчёт самой архитектуры хранения - может следует немного нормализовать данные, чтобы не было дублирования? Например в таблице shop хранить name, address и company_id. Где company_id будет внешним ключом на таблицу company. В таблице company хранить имя компании. Ну а сводные данные по магазину, классу и месту тогда назвать как-нибудь вроде shop_summary и там уже будут колонки с class, shop_id, locality_id.
Возможно ли переписать запрос, чтобы использовать shop_id вместо поиска по полному текстовому совпадению? Если уж невозможно, то тогда уже следовало бы добавить полнотекстовой индекс и искать с помощью match against, тогда будет возможность сгладить неточности в написании адреса.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей