|
|
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Ситуация простая... объясню на пальцах.: есть две таблицы справочника.: тСемья и тЧленыСемьи тСемья 1___Ивановы 2___Петровы 3___Сидоровы тЧленыСемьи 1___папа 2___мама 3___сестра 4___брат и тСвязка 1___1 1___2 1___3 2___1 2___2 3___1 3___2 3___3 3___4 Мне нужен запрос- вывести все семьи которые содержат одновременно папа,мама,сестра Я нашёл 2 решения 1) при помощи EXISTS 2) создание копий таблицы тСвязка, поиск в каждой копии по одному члену семьи и связка таблиц по ключу семьи...... Но как мне кажется- это не остимальные и не самые быстрые способы выборки.. Подскажите стандартное и быстродейственное решение.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 10:24 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
хм...ответа нет.....!? Вам непонятен вопрос ??? Или он кажется тривиальным ??? Или наоборот- не хочется возиться? Оставьте своё экспертное мнение, а лучше- экспертное решение вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 11:36 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 12:57 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
VIG, а если три сестры? Тогда тоже сработает, а это неверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 12:59 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Ну,"Три сестры" бывают только у Чехова Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 13:17 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Да...семей > 30000 членов семей порядка 2000 и более каждая семья содержит около 10 членов и выборка из семей может быть такая : найти семьи с индетификаторами членовСемьи ( 2 ; 500 ; 2000 ;1520 и 77 ) одновременно соответственно. Мне кажется - представленое мною проектирование базы является стандартным решением. И запрос должен быть стандартным, быстрым и простым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 13:33 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Владимир Саныч, Так сколько делать квасу??? 2 литра я уже обежал.... -) может мне побольше закваски делать?? Мне мой вопрос уже интерестен как спортивный интерес (конечно же я хочу найти оптимальное решение ) , но неужели на такое простое построение базы (причём оно применяется повсеместно) требуется придумывать "извращённые" запросы.... или это уже не стандартное решение!?? или по вторникам знатоки аксесс не заходят в форум....? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 14:16 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
1. Создаешь табличку тНайти, в которую записываешь требуемые идентификаторы (2 ; 500 ; 2000 ;1520 и 77). 2. Перемножаешь таблицу тСемья с таблицей тНайти: Код: plaintext 1. Запрос выполняется достаточно быстро. Сохраняешь запрос. 3. Линкуешь со своей таблицей тСвязка по двум полям. Получаешь требуемый набор семей. 4. Группируешь его и фсё. Все это можно сделать на сохраненных запросах. Нужно только менять записи в таблице тНайти и можно сразу получать результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 14:56 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
CtrlAlt Пардон, не понял , что значит группируешь??? (шаг 4) как я понимаю на 3 шаге получается все семьи в которых присутствует хотя бы один член из "найти"......... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 15:18 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Не хотя бы один член, а все, которые указаны в тНайти (а также те семьи, в которых помимо этих членов могут быть какие-то другие) А на 3-ем шаге у тебя получится что-то типа 3_2 3_500 3_2000 3_1520 3_77 .. 1113_2 1113_500 1113_2000 1113_1520 1113_77 А тебе нужен только сгруппированный первый столбец, что и делается в шаге 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 15:27 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
vlad_707 писал:Владимир Саныч, Так сколько делать квасу??? 2 литра я уже обежал.... А чего это, чуть что, сразу я... А что это за квас, который обегают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 15:38 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
2 vlad_707 Значит ты не знаешь что такое "извращенный запрос" 2 CtrAlt 4. Группируешь его и фсё. Да не фсё. Надо будет еще из каждой группы отобрать те ,у которых к-во членов в группе равно количеству строк в таблице Найти И зачем делать декартово произведение таблиц ,когда достаточно простого Inner Join между Найти и тЧленыСемьи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 15:47 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Да не фсё. Надо будет еще из каждой группы отобрать те ,у которых к-во членов в группе равно количеству строк в таблице Найти В задаче vlad_707 явно не указано, строгое должно быть соответствие или в семьях могут быть какие-нибудь еще другие члены. Более логичен второй вариант (как у меня), например, нужно найти семьи в которых есть сестра. В таком случае по твоему способу вообще не найдется никаких записей. Но, конечно, это только мои предположения. Один вариант из другого легко получить. И зачем делать декартово произведение таблиц ,когда достаточно простого Inner Join между Найти и тЧленыСемьи Как я понял, в тЧленыСемьи нет указания на семью, есть только в тСвязка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:04 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Вообще-то да, можно по-проще сделать 1. Связать таблицу тСвязка(по второму полю) с тНайти 2. Сгруппировать получившийся запрос по первому полю с Count по второму Условие на Count = кол-во записей в тНайти - для четкого соответствия Условие на Count >= кол-во записей в тНайти - для нечеткого соответствия (т.е. в семья могут быть и другие члены) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:13 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
В.С. обежал=обещал..... ( -) перелёт в обещание не входит..) ViG- спасибо, идею с каунтом понял. CtrlAlt - делал как вы говорите раньше...не получилось... , с каунтом и табличкой получится... теперь осталось проверить - будет ли это быстрее ранее сделанных способов. (мне кажется должно работать быстрее) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:25 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Как я понял, в тЧленыСемьи нет указания на семью, есть только в тСвязка Я и имел в виду тСвязка, тЧленыСемьи - это просто описка. Что же касается В задаче vlad_707 явно не указано, строгое должно быть соответствие или в семьях могут быть какие-нибудь еще другие члены. Более логичен второй вариант (как у меня), например, нужно найти семьи в которых есть сестра. В таком случае по твоему способу вообще не найдется никаких записей . - то позволю не согласиться Во первых vlad_707 ясно указал , что ему нужны семьи с составом родственником не меньше ,чем указано в критерии поиска. И мои варианты раз такие семьи находят (Просто в запросе от 13:17 надо заменить between на in(перечень_требуемых_родственников) Твой же вариант найдет семьи в которых есть хотя бы один из указанных родственников,что ,имхо, не есть правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:31 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Сейчас вставлю свои 3 копейки, может еще пол-литра кваса заработаю... Запрос 1: group by по номеру семьи и члену семьи и фильтр по 1-2-3. Запрос 2: из предыдущего запроса group by по номеру семьи и фильтр where count=3. Если это совпадает с каким-нибудь решением, предложенным раньше, то звиняйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:32 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Саныч,я тебя конечно звыняю, но это дословный перевод на русский моего запроса от 13:17 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:42 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Неееет, VIG, твой вариант отличается от моего. У меня групбаев двое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:45 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
2 CtrAlt Условие на Count >= кол-во записей в тНайти - для нечеткого соответствия (т.е. в семья могут быть и другие члены) Это лишнее.Никогда не будет Count > кол-во записей в тНайти ,так как "другие члены " просто не попадут в выборку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:45 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Даааа Саныч, у меня в подзапросе Distinct ,что в данном случае эквивалентно Group By ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:48 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
:^) Ну и ладно. Забираю свои 3 копейки обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 16:50 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
(c)VIG Ага, я уже догадался. Этот каунт, нужно считать в отдельном запросе. А затем прилинковывать его к результату. И там смотреть эти условия. Если нужно нечеткое соответствие (т.е. в семье могут быть и другие члены), то этот отдельный запрос необязателен, можно обойтись одним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 17:00 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Спасибо ,я мысль с каунтом понял, проверил, всё работает.. пока ,как мне кажется- это оптимальное решение. (конечно проверить нада на время выборки) В.С. спасибо.....-)) я ужо дошел сам про каунт вига (с группировками) до твоего ответа... (так что пол-литра отменяются....-)..) Но как вы думаете- это самое оптимальное (всмысле быстрое) решение или одно из решений делаются 2 группировки по > 300 000 записям + програмное определение количества членов семьи или создание таблицы где будет список интересующих значений и каунт по нему.. ( топик написал давно...-( ..забыл отправить...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 17:20 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Но как вы думаете- это самое оптимальное (всмысле быстрое) решение... Опыт-критерий истины Но думаю ,если правильно настроить индексы, то будет работь достаточно быстро ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 17:25 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
select family.name , count(*) from family inner join familymember f1 on ( family.ID = f1.familyID ) inner join familymember f2 on ( family.ID = f2.familyID ) inner join familymember f3 on ( family.ID = f3.familyID ) where f1.memberid = 1 and f2.memberid = 2 and f3.memberid = 3 group by family.name Получаем все семьи где есть хотя бы один папа, хотя бы одна мама, хотя бы одна сестра. Если нужны семьи без лишних пап, мам и сестер, потом фильтруем по count=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 18:24 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
to 1 Все правильно. Но что делать если надо будет найти 4,5.... членов семьи? Каждый раз переписывать запрос заново? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 19:02 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
я писал : Мне нужен запрос- вывести все семьи которые содержат одновременно папа,мама,сестра Я нашёл 2 решения 1) при помощи EXISTS 2) создание копий таблицы тСвязка, поиск в каждой копии по одному члену семьи и связка таблиц по ключу семьи...... Правильно ли я понял, что предложение 1, guest является модификацией моего решения 2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2003, 10:29 |
|
||
|
нужен опримальный запрос на выборку из связ. таблиц..
|
|||
|---|---|---|---|
|
#18+
Правильно, только одним запросом :) Ну и конечно решение не универсальное, никто и не говорил. Я кстати думаю, что по скорости оно будет оптимальным, во всяком случае при трех таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2003, 17:45 |
|
||
|
|

start [/forum/topic.php?all=1&fid=45&tid=1678001]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
144ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 527ms |

| 0 / 0 |
