powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Хитрая выборка из нескольких таблиц
19 сообщений из 19, страница 1 из 1
Хитрая выборка из нескольких таблиц
    #39223508
Доброе утро!
Прошу помощи у форумчан.
В базе есть таблица со структурой
id, ort, left, right, freq - все поля целочисленные
ort - номер луча
left - левая координата отрезка
right - правая координата отрезка
freq - количество ударов, т.е. сколько раз любой конец любого отрезка пришёлся на данную точку

Было необходимо получить все точки заданного ort в заданном диапазоне start,end с freq не менее определенного числа. Делал так:

Код: php
1.
2.
$query =  "(SELECT `left` FROM `g38-201505-08-80` WHERE `ort` = " . $ort . " AND `freq` >=" . $freq . "  AND `left` >= " . $start . " AND `left` <= " . $end . ") UNION ";
$query .= "(SELECT `right` FROM `g38-201505-08-80` WHERE `ort` = " . $ort . " AND `freq` >=" . $freq . " AND `right` >= " . $start . " AND `right` <= " . $end . ") ORDER BY `left` ASC";



Таким образом я получал набор неповторяющихся точек.
Теперь задача усложнилась. Необходимо получить все точки заданного ort из нескольких таблиц (допустим, трёх) в заданном диапазоне start,end. При этом freq должен быть не менее определённого числа хотя бы у данных из одной таблицы. При этом, если в других таблицах точки с такими координатами нет, вывести ноль. Как это сделать - тяму не хватает.
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223510
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Даниловleft - левая координата отрезка
right - правая координата отрезка
freq - количество ударов, т.е. сколько раз любой конец любого отрезка пришёлся на данную точкуЯННП. Всё-таки что собой представляют записи - точки или отрезки?
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223513
Да, действительно, сам запутал. Правильно так:

ort - номер луча
left - левая координата отрезка
right - правая координата отрезка
freq - количество ударов, т.е. сколько раз встречается данный отрезок

Отрезки в пределах таблицы могут пересекаться, концы одних могут служить началом других.
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223540
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Луч, отрезок, удары какие-то... давай нормализуем термины. Поскольку речь идёт о направленных отрезках, будем использовать для записи термин "вектор", причём подразумевая "одномерный вектор".
Тогда ort = номер, left = начало, right = конец... а теперь объясни вменяемо, что есть freq.
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223716
Akina,

freq - количество отрезков с такими left, right.
Например:
ort, left, right, freq
1 10 100 5
1 10 50 2
1 10 70 12
1 50 120 1
1 50 100 8

отрезков [1,100] - 5 штук, отрезков [10, 50] - 2 штуки и так далее
При этом у точки 10 будет 5+2+12 вхождений, у точки 50 2+1+8 вхождений и так далее
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223754
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Даниловотрезков [1,100] - 5 штук
Вероятно, [10,100]?

Так, со смыслом понятно. А теперь постарайтесь сформулировать задачу .
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223766
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaТак, со смыслом понятноМне ещё непонятно, почему в примере ort у всех записей одинаковый. Вроде бы выше говорилось, что это идентификатор отрезка. Или это ид класса/набора отрезков?
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223790
AkinaАлексей Даниловотрезков [1,100] - 5 штук
Вероятно, [10,100]?

Да, конечно. Извините, после дежурства, сплю на ходу.

Задача такая. Вот таких таблиц уже 3. Задается интервал [ort, start, end] и минимальное количество freq, которому должны удовлетворять точки.
Если есть несколько вхождений одинаковых left и right, но принадлежат они разным отрезкам, то суммарный freq для точки равен freq всех записей с этим значением. Требуется найти (желательно отсортировать по возрастанию, но это уже не беда) все точки, которые удовлетворяют следующим условиям:
1. все точки решения принадлежат вышеуказанному интервалу
2. Хотя бы в одной таблице суммарный freq точки больше или равен минимально необходимому
3. если в одной или двух таблицах такие точки есть, в остальных - нет, всё равно вывести результат для этой таблицы/таблиц, а для других - ноль.

Проблемы для меня три:
1. В таблице - отрезки, а оперировать приходится точками
2. суммарный freq считается для всех точек, причём приходится складывать и left и right
3. для одной таблицы как-то бы, наверное, ещё вывернулся, но тут их три


Будь это другой язык программирования, придумал бы уже реализацию, через TDictionary, к примеру. А тут ничего в голову не лезет.
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223791
tanglirМне ещё непонятно, почему в примере ort у всех записей одинаковый. Вроде бы выше говорилось, что это идентификатор отрезка. Или это ид класса/набора отрезков?
Я просто не продлил таблицу. Например, так:
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223793
ort, left, right, freq
1 10 100 5
1 10 50 2
1 10 70 12
1 50 120 1
1 50 100 8
2 10 300 1
2 14 45 9
3 7 190
и т.д.

id в таблицах тоже присуствует, но он просто записывается датчиками в качестве уникального идентификатора
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39223828
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ДаниловВ таблице - отрезки, а оперировать приходится точками
Вот это - пока основная проблема.
необходимо сформулировать строгий порядок перехода от "отрезков" к "точкам".

Алексей ДаниловНапример:
ort left right freq1 10 100 51 10 50 21 10 70 121 50 120 11 50 100 8
Допустим, тебе переданы
Алексей ДаниловЗадается интервал [ort, start, end] и минимальное количество freqтакие:
1) [ort, start, end, freq] = [1,60,80,2]
2) [ort, start, end, freq] = [1,40,80,2]
Для каждого варианта - какие записи ты посчитаешь "соответствующие" заданным условиям, и почему они "да", а остальные "нет"?
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39224339
AkinaДопустим, тебе переданы
1) [ort, start, end, freq] = [1,60,80,2]
2) [ort, start, end, freq] = [1,40,80,2]
Для каждого варианта - какие записи ты посчитаешь "соответствующие" заданным условиям, и почему они "да", а остальные "нет"?
1. [ort, start, end, freq] = [1,60,80,2]

Попадут точки из записей (выделено жирным)

ort left right freq1 10 100 51 10 50 21 10 70 121 50 120 11 50 100 8

Результат: только точка 70, т.к. ее частота - 12 и она попала в диапазон

2. [ort, start, end, freq] = [1,40,80,2]

Попадут точки из записей (выделено жирным)

ort left right freq1 10 100 51 10 50 21 10 70 121 50 120 11 50 100 8

Результат: две точки
50 с частотой 2+1+8 и 70 с частотой 12
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39224343
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Данилов,

т.е. "отрезок" - это не отрезок, а просто 2 точки, так? И "отрезок" удовлетворяет условию, если хотя бы одна из точек ему удовлетворяет?
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39224377
tanglirАлексей Данилов,

т.е. "отрезок" - это не отрезок, а просто 2 точки, так? И "отрезок" удовлетворяет условию, если хотя бы одна из точек ему удовлетворяет?
Изначально он отрезок, и для других расчётов он будет отрезком. Но в данном случае, действительно, да - это просто две точки. И второе - тоже верно, если хотя бы одна точка попадает в условие, она нам нужна. Если, кстати, обе точки попадают, то обе нам нужны.
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39224397
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Данилов,
забудь слово отрезок, есть понятие диапазон от и до, включая или не включая границы.
диапазон 10-50 и 50-100
значение 50 к чему относится?
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39224409
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ппц. Алексей Данилов , за такие структуры надо расстреливать...

Короче, сначала сделайте нормализацию своей таблицы, типа:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT ort, point, SUM(freq) freq
FROM (
    SELECT ort, left point, freq FROM g38-201505-08-80
    UNION ALL
    SELECT ort, right point, freq FROM g38-201505-08-80
) dummy


На полученной структуре отбор нужных данных тривиален. WHERE допишешь самостоятельно...
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39224417
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строка отвалилась...
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT ort, point, SUM(freq) freq
FROM (
    SELECT ort, left point, freq FROM g38-201505-08-80
    UNION ALL
    SELECT ort, right point, freq FROM g38-201505-08-80
) dummy
GROUP BY ort, point
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39225218
Akina,
Спасибо! Буду пробовать.
...
Рейтинг: 0 / 0
Хитрая выборка из нескольких таблиц
    #39225568
Вот в таком виде заработало:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT `ort` , `point` , SUM( `freq` ) `freq`
FROM (
SELECT `ort` , `left` AS `point` , `freq`
FROM `test01`
WHERE `chr` =1
AND `left` >100000
AND `left` <=200000
UNION ALL
SELECT `ort` , `right` AS `point` , `freq`
FROM `test01`
WHERE `chr` =1
AND `rigth` >100000
AND `right` <=200000
)dummy
GROUP BY `ort` , `point` 



Ещё раз спасибо :)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Хитрая выборка из нескольких таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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