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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2023, 22:04   #1
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
Вопрос Алгоритм поиска в MS Access из трех подчинённых таблиц

Здравствуйте.

Всю голову сломал, не могу решить такую задачу средствами DELPHI (ADO) и MS Access (извините я не спец по БД):

Есть 3 подчинённые таблицы

Таблица Базы
BAZA
BAZA.ID
BAZA.NAME

Ей подчинена таблица Показателей
POKAZATELY
POKAZATELY.ID
POKAZATELY.NAME
POKAZATELY.ID_BAZA

Ей подчинена таблица Оценок
OTSENKY
OTSENKY.ID
OTSENKY.NAME
OTSENKY.ID_POKAZATELY

В общем 2 уровня вложенности у базы есть показатели (у одной записи базы несколько показателей) у показателей есть оценки (у одного показателя несколько оценок).
Возможно ли осуществить поиск по такой базе такого набора данных и каким образом?

пользователь вводит:

показатель 1 = значение 1
показатель 2 = значение 2
показатель 3 = значение 3

и находит конкретную запись в базе или несколько записей у которых присутствует такой набор данных.
dolphin705 вне форума Ответить с цитированием
Старый 22.05.2023, 09:29   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select pokazateli.*, otshenki.*, baza.* 
from pokazateli
inner join otsenky on otsenky.id_pokazately =pokazateli.id
inner join baza on baza.id =pokazateli.id_baza
where pokazateli.name =<показатель 1>
  and otsenky.name =<значение 1>
0. берем конструктор запросов
1.1 добавляем первую таблицу (pokazateli)
1.2 добавляем условие поиска <показатель 1>
2.1 добавляем следующую таблицу (otsenky)
2.2 настраиваем условие соединения с предыдущей
2.3 добавляем условие поиска <значение 1>
3.1 добавляем следующую таблицу (baza)
3.2 добавляем ее условия соединения
4 настраиваем поля вывода

5. получится то что показано выше
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.05.2023, 11:44   #3
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Спасибо, переписал немного наименования полей получился такой код

Код:
SELECT BAZA_TB_NAME_ID, TB_POKAZATELY_ID, TB_OTSENKY_ID  
FROM ((TB_POKAZATELY 
INNER JOIN TB_OTSENKY on TB_OTSENKY.TB_OTSENKY_TB_POKAZATELY_ID = TB_POKAZATELY.ID) 
INNER JOIN BAZA on BAZA.ID = TB_POKAZATELY.TB_POKAZATELY_TB_BAZA_ID) 
WHERE 
(

((TB_POKAZATELY.TB_POKAZATELY_ID = 1) AND (TB_OTSENKY.TB_OTSENKY_ID = 2)) OR
((TB_POKAZATELY.TB_POKAZATELY_ID = 2) AND (TB_OTSENKY.TB_OTSENKY_ID = 17)) OR
((TB_POKAZATELY.TB_POKAZATELY_ID = 4) AND (TB_OTSENKY.TB_OTSENKY_ID = 27)) OR
((TB_POKAZATELY.TB_POKAZATELY_ID = 5) AND (TB_OTSENKY.TB_OTSENKY_ID = 37))

)
Он находит оба значения из базы, если присмотреться они отличаются по параметру № 5, вот как с этим быть? На ум приходит показать то значение BAZA_TB_NAME_ID которых больше в полученной таблице, но что-то мне подсказывает что это не правильный подход, хотя может и правильный. В таком случае как понять каких BAZA_TB_NAME_ID больше?
Изображения
Тип файла: jpg screenshot.23.jpg (91.3 Кб, 1 просмотров)

Последний раз редактировалось dolphin705; 22.05.2023 в 11:47. Причина: + картинка
dolphin705 вне форума Ответить с цитированием
Старый 22.05.2023, 12:52   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
В таком случае как понять каких BAZA_TB_NAME_ID больше?
добавить к запросу групповые операции (count, group by ...)
и возможно сортировку (order by ... )
SELECT count(BAZA_TB_NAME_ID), TB_POKAZATELY_ID, TB_OTSENKY_ID
...
group by TB_POKAZATELY_ID, TB_OTSENKY_ID
order by 1 desc

P.S. для ознакомления (изучения) SQL я всегда рекомендую
Мартин Грубер. Понимание SQL.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.05.2023 в 12:54.
evg_m вне форума Ответить с цитированием
Старый 22.05.2023, 22:10   #5
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Спасибо, получается уже похоже на то что нужно, но вопрос как в эту выборку добавить BAZA_TB_NAME_ID? Чтобы понять у какого именно BAZA_TB_NAME_ID больше всего группа получилась? Искал но нигде не нашел. Пробовал в селект дублировать но не верно. Как выйти на значение 62 из предыдущего поста из картинки?

Код:
SELECT 

count(BAZA_TB_NAME_ID) AS КОЛИЧЕСТВО,
TB_POKAZATELY_ID AS ПОКАЗАТЕЛЬ,
TB_OTSENKY_ID AS ЗНАЧЕНИЕ

FROM ((TB_POKAZATELY 
INNER JOIN TB_OTSENKY on TB_OTSENKY.TB_OTSENKY_TB_POKAZATELY_ID = TB_POKAZATELY.ID) 
INNER JOIN BAZA on BAZA.ID = TB_POKAZATELY.TB_POKAZATELY_TB_BAZA_ID) 
WHERE
(

((TB_POKAZATELY.TB_POKAZATELY_ID = 1) AND (TB_OTSENKY.TB_OTSENKY_ID = 2)) OR
((TB_POKAZATELY.TB_POKAZATELY_ID = 2) AND (TB_OTSENKY.TB_OTSENKY_ID = 17)) OR
((TB_POKAZATELY.TB_POKAZATELY_ID = 4) AND (TB_OTSENKY.TB_OTSENKY_ID = 27)) OR
((TB_POKAZATELY.TB_POKAZATELY_ID = 5) AND (TB_OTSENKY.TB_OTSENKY_ID = 37))

)
GROUP BY TB_POKAZATELY_ID, TB_OTSENKY_ID
ORDER BY 1 DESC
Результат вот такой выдает

КОЛИЧЕСТВО ПОКАЗАТЕЛЬ ЗНАЧЕНИЕ
2 4 27
2 2 17
2 1 2
1 5 37
dolphin705 вне форума Ответить с цитированием
Старый 23.05.2023, 09:05   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Чтобы понять у какого именно BAZA_TB_NAME_ID больше всего
Код:
select baza_Tb_name_id, count(*)
from ( select distinct baza_tb_name_id, ....
       )
group by baza_Tb_name_id
order by 2 desc
Код:
select baza_tb_name_id, count(*)
from (  -- вложенный запрос 
        SELECT distinct BAZA_TB_NAME_ID, TB_POKAZATELY_ID, TB_OTSENKY_ID AS

        FROM ((TB_POKAZATELY 
        INNER JOIN TB_OTSENKY on TB_OTSENKY.TB_OTSENKY_TB_POKAZATELY_ID = TB_POKAZATELY.ID) 
        INNER JOIN BAZA on BAZA.ID = TB_POKAZATELY.TB_POKAZATELY_TB_BAZA_ID) 
        WHERE ( 

        ((TB_POKAZATELY.TB_POKAZATELY_ID = 1) AND (TB_OTSENKY.TB_OTSENKY_ID = 2)) OR
        ((TB_POKAZATELY.TB_POKAZATELY_ID = 2) AND (TB_OTSENKY.TB_OTSENKY_ID = 17)) OR
        ((TB_POKAZATELY.TB_POKAZATELY_ID = 4) AND (TB_OTSENKY.TB_OTSENKY_ID = 27)) OR
        ((TB_POKAZATELY.TB_POKAZATELY_ID = 5) AND (TB_OTSENKY.TB_OTSENKY_ID = 37))

        )
group by baza_tb_name_id
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.05.2023 в 09:13.
evg_m вне форума Ответить с цитированием
Старый 30.06.2023, 12:23   #7
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

evg_m, Огромное Вам спасибо, от души! Очень помогли, в итоге всё получилось как нужно.
dolphin705 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос из трех таблиц, дубли информации Lokos БД в Delphi 11 21.12.2016 15:43
Реализовать возможность поиска по заданному условию по одной из таблиц БД (есть программа Delphi база данных Access) carrie bradshaw Помощь студентам 3 27.03.2014 22:20
Вывести записи из трех таблиц Demares SQL, базы данных 6 02.03.2011 13:30
select-запрос из трех таблиц AJlEKCA БД в Delphi 10 19.01.2011 01:38
связь главной и двух подчинённых таблиц access в delphi7 kelod БД в Delphi 9 11.07.2010 12:45