|
|
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Доброе утро! Прошу помощи у форумчан. В базе есть таблица со структурой id, ort, left, right, freq - все поля целочисленные ort - номер луча left - левая координата отрезка right - правая координата отрезка freq - количество ударов, т.е. сколько раз любой конец любого отрезка пришёлся на данную точку Было необходимо получить все точки заданного ort в заданном диапазоне start,end с freq не менее определенного числа. Делал так: Код: php 1. 2. Таким образом я получал набор неповторяющихся точек. Теперь задача усложнилась. Необходимо получить все точки заданного ort из нескольких таблиц (допустим, трёх) в заданном диапазоне start,end. При этом freq должен быть не менее определённого числа хотя бы у данных из одной таблицы. При этом, если в других таблицах точки с такими координатами нет, вывести ноль. Как это сделать - тяму не хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 07:16 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Алексей Даниловleft - левая координата отрезка right - правая координата отрезка freq - количество ударов, т.е. сколько раз любой конец любого отрезка пришёлся на данную точкуЯННП. Всё-таки что собой представляют записи - точки или отрезки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 07:38 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Да, действительно, сам запутал. Правильно так: ort - номер луча left - левая координата отрезка right - правая координата отрезка freq - количество ударов, т.е. сколько раз встречается данный отрезок Отрезки в пределах таблицы могут пересекаться, концы одних могут служить началом других. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 07:52 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Луч, отрезок, удары какие-то... давай нормализуем термины. Поскольку речь идёт о направленных отрезках, будем использовать для записи термин "вектор", причём подразумевая "одномерный вектор". Тогда ort = номер, left = начало, right = конец... а теперь объясни вменяемо, что есть freq. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 08:59 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
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 вхождений и так далее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 11:56 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Алексей Даниловотрезков [1,100] - 5 штук Вероятно, [10,100]? Так, со смыслом понятно. А теперь постарайтесь сформулировать задачу . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 12:35 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
AkinaТак, со смыслом понятноМне ещё непонятно, почему в примере ort у всех записей одинаковый. Вроде бы выше говорилось, что это идентификатор отрезка. Или это ид класса/набора отрезков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 12:41 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
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, к примеру. А тут ничего в голову не лезет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 12:56 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
tanglirМне ещё непонятно, почему в примере ort у всех записей одинаковый. Вроде бы выше говорилось, что это идентификатор отрезка. Или это ид класса/набора отрезков? Я просто не продлил таблицу. Например, так: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 12:57 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
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 в таблицах тоже присуствует, но он просто записывается датчиками в качестве уникального идентификатора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 12:58 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Алексей ДаниловВ таблице - отрезки, а оперировать приходится точками Вот это - пока основная проблема. необходимо сформулировать строгий порядок перехода от "отрезков" к "точкам". Алексей ДаниловНапример: 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] Для каждого варианта - какие записи ты посчитаешь "соответствующие" заданным условиям, и почему они "да", а остальные "нет"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 13:23 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2016, 06:52 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Алексей Данилов, т.е. "отрезок" - это не отрезок, а просто 2 точки, так? И "отрезок" удовлетворяет условию, если хотя бы одна из точек ему удовлетворяет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2016, 06:55 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
tanglirАлексей Данилов, т.е. "отрезок" - это не отрезок, а просто 2 точки, так? И "отрезок" удовлетворяет условию, если хотя бы одна из точек ему удовлетворяет? Изначально он отрезок, и для других расчётов он будет отрезком. Но в данном случае, действительно, да - это просто две точки. И второе - тоже верно, если хотя бы одна точка попадает в условие, она нам нужна. Если, кстати, обе точки попадают, то обе нам нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2016, 08:34 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Алексей Данилов, забудь слово отрезок, есть понятие диапазон от и до, включая или не включая границы. диапазон 10-50 и 50-100 значение 50 к чему относится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2016, 09:08 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Ппц. Алексей Данилов , за такие структуры надо расстреливать... Короче, сначала сделайте нормализацию своей таблицы, типа: Код: sql 1. 2. 3. 4. 5. 6. На полученной структуре отбор нужных данных тривиален. WHERE допишешь самостоятельно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2016, 09:27 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Строка отвалилась... Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2016, 09:37 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, Спасибо! Буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2016, 06:11 |
|
||
|
Хитрая выборка из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Вот в таком виде заработало: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Ещё раз спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2016, 13:30 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39223510&tid=1831866]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 216ms |
| total: | 369ms |

| 0 / 0 |
