Ошибка в выборки SQL MySQL

266
24 апреля 2018, 03:43

Здравствуйте, пытаюсь сделать выборку данных, но постоянно возвращает пустое значение. В чем ошибка?

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

Структура таблицы:

Answer 1

Добрый день.

В таком варианте запрос работает:

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, тогда будет возможность сгладить неточности в написании адреса.

READ ALSO
Ввод символа в числовой тип данных

Ввод символа в числовой тип данных

Например, если я пытаюсь записать в int букву А, то программа падаетМожно ли как-то это отлавливать до того, как символ попадёт в переменную?

238
MOUSEEVENTF_MOVE Некорректно перемещает мышь

MOUSEEVENTF_MOVE Некорректно перемещает мышь

Мне нужно программно нажать на ЛКМ в 1160, 800; Координаты я получил через свое приложение через CursorPosition на C#

286
Переменное число параметров в функции

Переменное число параметров в функции

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

258
Идентификатор не определен Win api C++ [требует правки]

Идентификатор не определен Win api C++ [требует правки]

Всё решил проблему, оказывается GWL_WNDPROC уже не используется вместо него теперь GWLP_WNDPROC

1002