Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2015, 09:42   #1
tmp_02
Новичок
Джуниор
 
Регистрация: 04.11.2015
Сообщений: 10
По умолчанию Выборка по неполному совпадению

Ребята, помогите новичку SQL, плиз!
Есть таблица на 5 колонок. ID и четыре числа INT.
Нужно для каждого ID подобрать группу других ID, для которых 3 из четырех чисел в строке были бы одинаковыми.
Физический смысл задачи - пирамиды с прописанными номерами вершин. Эти пирамиды контактируют и могут иметь по три общих вершины. Надо выписать эти контакты в отдельную таблицу для каждого ID.
Ссыль на SQL для генерации таблицы.
СУБД - MySQL, или SQLite на выбор.
Query не дается.
Надеюсь, тут есть не такие чопорные люди, как тут, способные адекватно отнестись к новичку.
tmp_02 вне форума Ответить с цитированием
Старый 04.11.2015, 10:00   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
для которых 3 из четырех чисел в строке были бы одинаковыми
И не важно в каких полях эти совпадения или только в одноименных?
Код:
id field1 field2 field3 field4
 1      1      3      5      8   совпадают значения одноименных полей 1 2 4
 2      1      3      7      8

 5      7      6      7     14   совпадают значения одноименных полей 2 3 4
 9      8      6      7     14

 9      8      6      7     14   совпадают значения 6 14 8 не одноименных полей
10      6      14     8     15
И по ссылке правильно ругаются, что вся проблема в отсутствии нормализации данных
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.11.2015, 10:27   #3
tmp_02
Новичок
Джуниор
 
Регистрация: 04.11.2015
Сообщений: 10
По умолчанию

Вот по третьему вашему варианту - именно оно.
Пытаюсь ругань от чопорности отделить. Но когда мне клоунаду приписывают, как-то не по себе становится Где тут клоунада в задаче?

Последний раз редактировалось tmp_02; 04.11.2015 в 10:47.
tmp_02 вне форума Ответить с цитированием
Старый 04.11.2015, 12:51   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

MySQL не установлен, на примере MS SQL

Преобразовал бы исходную, сделав из каждой записи 4 записи примерно так

Код:
SELECT U.*
  into #Table1
  FROM (
SELECT id,1 AS Num,Field1 AS Field FROM Table1
UNION
SELECT id,2 AS Num,Field2 AS Field FROM Table1
UNION
SELECT id,3 AS Num,Field3 AS Field FROM Table1
UNION
SELECT id,4 AS Num,Field4 AS Field FROM Table1) U
Для полученной таблицы индексы создал бы примерно такого содержания (уточнить по плану следующего запроса)
Код:
CREATE INDEX index_Table1 ON #Table1 (id, Num)
CREATE INDEX index_Table2 ON #Table1 (Field, id)
Ну и список идентификаторов искомых
Код:
SELECT T11.id AS Id1,T12.Id AS Id2
  FROM #Table1 T11,#Table1 T12,#Table1 T21,#Table1 T22,#Table1 T31,#Table1 T32,#Table1 T41,#Table1 T42
  WHERE T11.Field=T12.Field AND T11.id<T12.id AND 
        T21.Id=T11.id AND T21.Num<>T11.Num AND
        T22.Id=T12.id AND T22.Num<>T12.Num AND T22.Field=T21.Field AND
        T31.id=T11.id AND T31.Num<>T11.Num AND T31.Num<>T21.Num AND
        T32.id=T12.id AND T32.Num<>T12.Num AND T32.Num<>T22.Num AND T32.Field=T31.Field AND
        T41.id=T11.id AND T41.Num<>T11.Num AND T41.Num<>T21.Num AND T41.Num<>T31.Num AND
        T42.id=T12.id AND T42.Num<>T12.Num AND T42.Num<>T22.Num AND T42.Num<>T32.Num AND T42.Field<>T41.Field
  GROUP BY T11.id,T12.Id
  ORDER BY T11.id,T12.Id
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.11.2015, 13:18   #5
tmp_02
Новичок
Джуниор
 
Регистрация: 04.11.2015
Сообщений: 10
По умолчанию

Спасибо, Аватар!
Как бы теперь это еще переварить и переложить на свою задачу и синтаксис.
Если нетрудно и не жалко потратить еще чуток времени, не могли бы вы показать результат, получающийся на боевой таблице?

Таблица в SQL
CSV файл

С указанием времени обработки запроса.
tmp_02 вне форума Ответить с цитированием
Старый 04.11.2015, 13:20   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вечерком может быть, если не забуду и для MS SQL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.11.2015, 13:23   #7
tmp_02
Новичок
Джуниор
 
Регистрация: 04.11.2015
Сообщений: 10
По умолчанию

Спасибо еще раз!
Очень обяжете.
tmp_02 вне форума Ответить с цитированием
Старый 04.11.2015, 19:26   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

~ 2сек, оптимизацией не занимался

Если
Код:
WHERE T11.Field=T12.Field AND T11.id<T12.id AND
заменить на
Код:
WHERE T11.Field=T12.Field AND T11.id<>T12.id AND
то будет ровно вдвое больше записей - т.е. кроме 1;470 попадет еще и запись 470;1
Вложения
Тип файла: zip Результат.zip (12.6 Кб, 8 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.11.2015, 19:40   #9
tmp_02
Новичок
Джуниор
 
Регистрация: 04.11.2015
Сообщений: 10
По умолчанию

Аватар, огромное спасибо за потраченное на меня время!
Результат, увы, не тот
p1-p4 лежат по порядку в диапазоне 1-446.
То есть 1915 пирамид делят между собой 446 вершин.
Что ж, не буду загаживать мозги людям и себе. Делаю вывод, что это задача не для СУБД, а программерская. Буду копать и оптимизировать цикл сравнения всех со всеми.
Спасибо еще раз!
tmp_02 вне форума Ответить с цитированием
Старый 04.11.2015, 20:11   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Результат не тот по простой причине - задача не правильно поставлена. Соответственно и результат отличается от ожидаемого
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по большему совпадению Rost93 SQL, базы данных 6 31.10.2013 12:53
Замена данных в ячейках по совпадению Poltavtcev Microsoft Office Excel 3 18.03.2012 16:52
Поиск по неполному совпадению sarova Microsoft Office Excel 3 17.07.2011 13:46
Суммирование по неполному совпадению alexvav Microsoft Office Excel 9 22.08.2010 21:39
Фильтрация по неполному ключу в компонентах ADO ГЫнок Помощь студентам 1 17.08.2008 16:58