Для данного списка уникальных элементов, после сортировки их по нескольким столбцам в партиях, я получаю дублирование элементов.Ошибка дублирования с сортировкой MySQL по нескольким столбцам
Есть 2 таблицы:
- item_popularity_tbl:
iid (UINT, PK) pplt (UTINYINT)
- item_cat_id_tbl:
iid (UINT, PK) cid (UTINYINT)
Where:
iid: item ID, unique values in the tables
cid: cat ID, values in the range (1, 15). Multiple items can have same cid.
pplt: popularity, vals in the range (1, 10). Multiple items can have same pplt.
Учитывая список элементов идентификаторов, все уникальных, мне нужно заказать его чид ASC, а затем pplt DESC.
Я использую ниже SQL (с помощью MySQL) код для ее достижения:
# python code snippet
def db_get_items_sorted(conn, iid_list, offset, limit):
n1 = ','.join(['%s'] * len(iid_list))
#
sql_stmt = ("SELECT a.iid, a.cid, b.pplt "
"FROM pclg.item_cat_id_tbl AS a "
"INNER JOIN pclg.item_popularity_tbl AS b ON b.iid=a.iid "
"WHERE a.iid IN (%s) "
"ORDER BY a.cid ASC, "
"b.pplt DESC "
"LIMIT %s,%s") % (n1, offset, limit)
#
return conn.query(sql_stmt % tuple(iid_list))
я называю db_get_items_sorted (...) в партиях 10. Я проверил это с входом iid_list 58 пунктов (уникальный) , против полностью заполненных столов с уникальными iids. Для каждого вызова mysql возвращает уникальные 10 iids с правильной сортировкой, как и требовалось. Но когда я объединяю партии для создания последних 58 элементов, я замечаю, что несколько элементов (iid) в списке дублируются (и для них все возвращенные столбцы совпадают, в основном, полное дублирование). Например, 48 уникальных строк и 10 дубликатов.
Если я вызываю db_get_items_sorted (...) со смещением 0 и предел 58, то нет дубликатов iid. Тем не менее, мне нужно позвонить небольшими партиями, так как мы можем потенциально выполнить эту сортировку для нескольких тысяч элементов, продвигаясь вперед.
Вопрос: как достичь уникальной уникальности между партиями?
Если отдельный поток вставки или удаления записей, как вы делаете пакетирование, то 'OFFSET' перепутались. –
@ RickJames Это хороший момент, Рик. Однако в этом случае такого сценария не существует, например, статических таблиц. Использование DISTINCT, как упоминалось в scaisEdge ниже, решает проблему. Но непонятно, почему нам нужно DISTINCT и почему происходит дублирование. – Ethan
'JOIN' раздувает количество строк. –