Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите написать запрос / 24 сообщений из 24, страница 1 из 1
03.11.2015, 13:14:20
    #39093652
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
Ребята, помогите плиз! Помираю от ощущения нерешенной задачи :)
В принципе, могу воспользоваться MySQL, поэтому извините за репостинг собственного вопроса из другого раздела.
Показать записи где числа в N-ом количестве столбцов из 10 столбцов совпадают
В SQL zero и все упирается в грамотно составленный query.
Можно программированием и циклами обойтись, но хотелось приобщиться к прекрасному миру БД. :)
...
Рейтинг: 0 / 0
03.11.2015, 13:17:29
    #39093656
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
СУБД у вас какая?

И что такое "SQL zero" ?
...
Рейтинг: 0 / 0
03.11.2015, 13:20:38
    #39093663
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
tmp_02все упирается в грамотно составленный query.
Нет, всё упирается в безграмотно построенную структуру.
Если сравнение полей записи имеет смысл, то эти поля содержат однотипный атрибут записи. То есть структура денормализована. Нормализуй - и запрос станет элементарным, если не сказать тривиальным.
...
Рейтинг: 0 / 0
03.11.2015, 13:21:46
    #39093664
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
miksoft,Имел в виду, что я - практически ноль пока в SQL.
На борту есть SQLite и MySQL
...
Рейтинг: 0 / 0
03.11.2015, 13:23:05
    #39093668
Помогите написать запрос
tmp_02,

unpivot -> join -> pivot
...
Рейтинг: 0 / 0
03.11.2015, 13:28:07
    #39093677
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
Akinatmp_02все упирается в грамотно составленный query.
Нет, всё упирается в безграмотно построенную структуру.
Если сравнение полей записи имеет смысл, то эти поля содержат однотипный атрибут записи. То есть структура денормализована. Нормализуй - и запрос станет элементарным, если не сказать тривиальным.
Дык вроде даже, если и отсортировать данные построчно, как-то у меня все равно не склеивается условия выборки 3(2,1) из 4-х. Нуб :(

Добрый Э - Эхunpivot -> join -> pivot
Спасибо! Покурю эту штуку.
...
Рейтинг: 0 / 0
03.11.2015, 13:28:45
    #39093678
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
В MySQL можно немного схитрить:
Код: sql
1.
WHERE (id=p1)+(id=p2)+(id=p3)+(id=p4)=3

Так будут выбраны те записи, где у поля id ровно три совпадения с другими полями.

Но, похоже, это только часть задачи. А целиком я ее не понял.
...
Рейтинг: 0 / 0
03.11.2015, 13:34:52
    #39093686
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
miksoftВ MySQL можно немного схитрить:
Код: sql
1.
WHERE (id=p1)+(id=p2)+(id=p3)+(id=p4)=3


Но, похоже, это только часть задачи. А целиком я ее не понял.
Спасибо! Осмысливаю.
А вообще задача геометрическая. 4 числа - номера вершин пирамидок, которые прилегают к друг другу. Соответственно у каждой может быть 4 соседа. Но есть случаи, когда соседей может быть меньше. Для всех ID надо такое соседство отследить.
...
Рейтинг: 0 / 0
03.11.2015, 13:52:15
    #39093721
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
[quot miksoft]В MySQL можно немного схитрить:
Код: sql
1.
WHERE (id=p1)+(id=p2)+(id=p3)+(id=p4)=3


Под p1-p4 увы, подразумеваются не ID этой же таблицы, поэтому такая конструкция не работает. Надо было мне сразу физический смысл описать.
...
Рейтинг: 0 / 0
03.11.2015, 13:54:20
    #39093725
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
tmp_02miksoftВ MySQL можно немного схитрить:
Код: sql
1.
WHERE (id=p1)+(id=p2)+(id=p3)+(id=p4)=3


Под p1-p4 увы, подразумеваются не ID этой же таблицы, поэтому такая конструкция не работает. Надо было мне сразу физический смысл описать.Тогда описывайте задачу целиком, а не в стиле "Для каждого ID надо найти такие соответствующие ID".
...
Рейтинг: 0 / 0
03.11.2015, 13:55:07
    #39093729
Помогите написать запрос
tmp_02,

ну все правильно. делаешь посредством unpivot или его аналогов (ввиду отсутствия UNPIVOT-а в MySQL / SQLite) нормализацию. Джойнишь результат денормализации самого на себя, в поисках соседствующих пирамидок, далее посредством pivot-а или его аналогов (в виду отсутствия PIVOT-а в MySQL / SQLite) вновь денормализовываешь данные к нужному виду.
...
Рейтинг: 0 / 0
03.11.2015, 13:55:34
    #39093731
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
tmp_02Akinaпропущено...

Нет, всё упирается в безграмотно построенную структуру.
Если сравнение полей записи имеет смысл, то эти поля содержат однотипный атрибут записи. То есть структура денормализована. Нормализуй - и запрос станет элементарным, если не сказать тривиальным.
Дык вроде даже, если и отсортировать данные построчно, как-то у меня все равно не склеивается условия выборки 3(2,1) из 4-х. Нуб :(

Добрый Э - Эхunpivot -> join -> pivot
Спасибо! Покурю эту штуку.


проблема в том, что нет их в mySQL...
а так - кури...

тебе про структуры уже все сказали - это самый правильный ответ.
...
Рейтинг: 0 / 0
03.11.2015, 13:56:21
    #39093733
Помогите написать запрос
Добрый Э - Эхtmp_02,

ну все правильно. делаешь посредством unpivot или его аналогов (ввиду отсутствия UNPIVOT-а в MySQL / SQLite) нормализацию. Джойнишь результат де нормализации самого на себя, в поисках соседствующих пирамидок, далее посредством pivot-а или его аналогов (в виду отсутствия PIVOT-а в MySQL / SQLite) вновь денормализовываешь данные к нужному виду.
...
Рейтинг: 0 / 0
03.11.2015, 14:00:47
    #39093742
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
Ох ты ж! Как все сложно-то. Загрузили :(
Чую не вытянут мои мозги всей инфы и придется вложенными циклами и программингом обходиться. А так надеялся на чудо...
...
Рейтинг: 0 / 0
03.11.2015, 14:04:24
    #39093747
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
tmp_02задача геометрическая. 4 числа - номера вершин пирамидок, которые прилегают к друг другу. Соответственно у каждой может быть 4 соседа.
По-моему, три соседа - себя считать как бы моветон. А то начнёшь углы в комнате считать, посчитаешь себя. получишь пять углов...
Сделал бы по-нормальному (ID вершины - ID пирамидки) - и получился бы у тебя простейший запрос. А так придётся или вручную распивочивать, или устраивать суммирование сравнений "каждый с каждым".
...
Рейтинг: 0 / 0
03.11.2015, 14:10:23
    #39093750
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
AkinaСделал бы по-нормальному (ID вершины - ID пирамидки) - и получился бы у тебя простейший запрос.
Увы, мне надо отследить прилегание гранями каждой пирамидки с соседями. Поэтому нужна выборка по три. А так, к одной вершине может больше, чем три пирамиды прилегать.
...
Рейтинг: 0 / 0
03.11.2015, 14:27:45
    #39093779
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
tmp_02, универсальное решение этой задачи для любой SQL субд такое:

1) создаете 3 новые строковые колонки m1, m2, m3
2) программным способом заполняете эти колонки для каждого ряда на основе следующего алгоритма

Код: javascript
1.
2.
3.
4.
5.
list = sort([p1, p2, p3, p4]);

m1 = makestring(list[0], ":", list[1]);
m2 = makestring(list[0], ":", list[1], ":", list[2]);
m3 = makestring(list[0], ":", list[1], ":", list[2], ":", list[3]);


3) итоговый запрос для решения вашей задачи выглядит вот так

Код: sql
1.
2.
3.
4.
5.
select id
    , (select id from nodes a where a.m1 = t.m1 && a.id != t.id limit 1) c1
    , (select id from nodes b where b.m2 = t.m2 && a.id != t.id limit 1) c2
    , (select id from nodes c where c.m3 = t.m3 && a.id != t.id limit 1) c3
from nodes t
...
Рейтинг: 0 / 0
03.11.2015, 14:46:05
    #39093797
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
Lumix,Спасибо!
Буду пробовать.
...
Рейтинг: 0 / 0
03.11.2015, 14:51:03
    #39093804
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
tmp_02мне надо отследить прилегание гранями каждой пирамидки с соседями.
Элементарно.
Код: sql
1.
2.
GROUP BY `ID вершины`
HAVING COUNT(`ID пирамидки`) = n


Для полной вершины n=4, для неполной соответственно меньше.
...
Рейтинг: 0 / 0
03.11.2015, 15:48:17
    #39093888
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
AkinaЭлементарно.

Я тоже думал, что для СУБД это плевое дело.
Попробую добавить немного графики , если поможет.
...
Рейтинг: 0 / 0
03.11.2015, 16:34:27
    #39093929
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
Lumix , таблицу сгенерил , но запрос споткнулся об Unknown column 'a.ID' in 'where clause'
И это вроде не то, что требуется.
Эх, видать от доооолгих циклов мне не уйти :)
...
Рейтинг: 0 / 0
03.11.2015, 16:39:56
    #39093938
Помогите написать запрос
MasterZivпроблема в том, что нет их в mySQL...
а так - кури...

тебе про структуры уже все сказали - это самый правильный ответ.
замена несуществующих фич на общепринятые аналоги:
1) unpivot - cross join на табличку с нужным кол-вом строк (в данном случае - четыре строки достаточно)
2) pivot - множественный case when в селект листе с последующей группировкой.
...
Рейтинг: 0 / 0
03.11.2015, 20:44:17
    #39094075
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
tmp_02 Lumix , таблицу сгенерил ,

Чтобы подобные запросы выполнялись мгновенно, таблица должна быть с индексами.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table nodes 
(
   id int
   , p1 int
   , p2 int
   , p3 int
   , p4 int
   , m1 char(15), key _m1 (m1)
   , m2 char(15), key _m2 (m2)
   , m3 char(15), key _m3 (m3)
)
engine = innodb
character set utf8
collate utf8_general_ci;
...
Рейтинг: 0 / 0
06.11.2015, 12:01:50
    #39096383
tmp_02
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать запрос
IDF_ID1F_ID2F_ID3F_ID4............18986699901329189949174810981817190087402172119019011031755............

Кроме, как на себя, ни на кого в этом мире нельзя положиться. :)
Lumix'у отдельный привет! :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите написать запрос / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]