На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Сложный SQL запрос
    PostgreSQL.
    Подскажите, пожалуйста, как исправить SQL запрос, чтобы получить данные указанные на прилагаемой картинке.
    Если убрать AND organizations_rooms.enddata IS NULL, то все равно получаю не то, что надо.
    Спасибо.
    Прикреплённый файлПрикреплённый файлUntitled_2.jpg (214,45 Кбайт, скачиваний: 400)
    Сообщение отредактировано: Kitty -
      Ну не лечат тут по фотографиям!
        Цитата Akina @
        Ну не лечат тут по фотографиям!

        Лечат.

        Нужен LEFT JOIN к таблице organizations.
          MIF
          На самом деле я хотел сказать, что надо описывать задачу, а не просить исправить кривую попытку решения оной. Я тоже предполагаю, что автору надо бы начать изучать сторонние связывания... но стопроцентной убеждённости, что неозвученная автором логика получения результата совпадает со сделанным тобой предположением, нет.
            Akina, может MIF прочитал всю тему
            Правильная связь таблиц?
              Bas
              Ага, а ещё нашёл в Инете и прочитал биографию топикстартера... есть тема, есть информация в ней, и если ТС не дал ссылки на другие темы - значит, они не имеют отношения к обсуждаемому вопросу, и их учёт может привести к ошибочным предположениям и, соответственно, неверному результату.
                Цитата
                надо описывать задачу


                Есть выпадающий список, в котором пользователь выбирает организацию.
                Помимо этого пользователь видит список всех помещений.
                Напротив помещений пользователь может ставить галочки.
                Установка галочки записывает связь в таблицу, что это помещение принадлежит этой организации. Если пользователь снимает галочку, то в поле enddata записывается время окончания эксплуатации этого помещения. Таким образом, это помещение становиться свободным.
                Допустим, пользователь выбрал организацию №1.
                Изначально есть, к примеру, три помещения
                A
                B
                C
                Пользователь поставил галочки у A и B.
                Теперь пользователь выбрал организацию №2.
                Мне надо чтобы пользователь видел, что помещения A и B заняты организацией №1. Т.е. мне надо вывести напротив A и B название организации №1. И напротив С вывести пусто. Чтобы видна была общая картина.
                Помимо всего, надо учесть, что если в помещении B, к примеру, сняли галочку, то оно свободно снова для всех организаций.

                Попробую исправить этот запрос рекомендацией LEFT JOIN.
                ExpandedWrap disabled
                  SELECT rooms.id, rooms.name AS roomname, rooms.checkbool, organizations.name AS orgname
                  FROM rooms, organizations, organizations_rooms
                  WHERE rooms.id=organizations_rooms.id_rooms
                  AND organizations_rooms.id_organizations=organizations.id
                  AND organizations_rooms.enddata IS NULL
                  ORDER BY rooms.name;
                  Раз надо вывести все помещения - таблица помещений должна быть слева.
                  ExpandedWrap disabled
                    FROM rooms r
                    LEFT JOIN organizations_rooms o_r ON r.id=o_r.id_rooms
                    LEFT JOIN organizations o ON o_r.id_organizations=o.id

                  Признаком свободности является NULL в полях от таблицы organizations. Т.е. галку следует убрать. Если же там непусто - ставим галку и пишем фамилию организации.

                  PS. При таком подходе настоятельно не советую делать запрос источником данных формы - хлебнёте. Лучше непривязанная форма и программные заполнение и внесение изменений. Ещё лучше - если применение изменений требует нажатия кнопки или подтверждения.
                    Цитата
                    Признаком свободности является NULL в полях от таблицы organizations.


                    Прощу прощения не доходит до меня. :(
                    Признаком свободности вроде как является заполненное поле enddata т.е. если там есть дата окончания эксплуатации то и помещение свободно.
                    На прилагаемой картинке интерфейс программы. Окна отображаются в окне web браузера. То что мне нужно, нарисовала стрелочками. :)
                    Прикреплённый файлПрикреплённый файлweb.jpg (124,2 Кбайт, скачиваний: 426)
                      Цитата Kitty @
                      Признаком свободности вроде как является заполненное поле enddata т.е. если там есть дата окончания эксплуатации то и помещение свободно.

                      Здрасьте, приехали... В той теме, коя обсуждалась раньше, и на кою дали ссылку, кто-то убеждал нас, что ни история, ни планы на будущее нафиг не нужны. Ну да ладно, либо поля дат заполнены, либо нет.
                      Если НЕ заполнены (вариант 1) - тут всё ясно, помещение свободно.
                      Но если заполнены - то либо срок не истёк, помещение занято (вариант 2), либо срок истёк, но по непонятной причине запись не очищена (вариант 3). Вставляем оператору клизьму за несвоевременное обновление данных, очищаем поля - и вариант 3 волшебным образом оказывается вариантом 1.

                      Не хотите - ну тогда проверяйте не на NULL, а на то, что текущая дата (не) лежит между значениями полей начала и конца аренды помещения.
                        Цитата Kitty @
                        Цитата
                        Признаком свободности является NULL в полях от таблицы organizations.


                        Прощу прощения не доходит до меня. :(
                        Признаком свободности вроде как является заполненное поле enddata т.е. если там есть дата окончания эксплуатации то и помещение свободно.
                        На прилагаемой картинке интерфейс программы. Окна отображаются в окне web браузера. То что мне нужно, нарисовала стрелочками. :)
                        Прикреплённый файлПрикреплённый файлweb.jpg (124,2 Кбайт, скачиваний: 426)

                        Маленькое фи
                        Такая форма хороша когда помещений в списке 10. Когда их писят - такая форма неудобна. Соответственно у помещения должно быть больше характеристик, которые надо выносить на панель фильтра. (например тип помещения - торговое, служебное, офис, санузел)

                        Таки мысль с дата с -по приняли, это хорошо.
                        А вот схемы до сих пор нет Это плохо. По ней было бы легко понять что с чем надо связать и по каким критериям выбрать
                        Второй шаг - на форме должен быть выбор даты, на которую смотрим свободные помещения
                        Далее про enddata. Мысль вы поняли не до конца
                        EndData заполнена ВСЕГДА
                        Если договор аренды бессрочный то там что-тио относительно далекое. Например 01.01.2201. (Уверен что к этой дате Ваше ПО никому уже не понадобится, так что можно рассматривать как аналог +бесконечность)
                        Помещение занято если на дату есть запись по помещению где дата между BeginData и EndData, иначе оно свободно

                        Ну и верно замечено - в форме можно набрать каких угодно галочек ,но пока юзер не нажмет кнопку "сохранить" никаких изменений в БД


                        Да и еще одно фи
                        Я бы рекомендовал вернутся к проектированию структуры. Судя по вопросам вы ее не проработали должным образом.
                          Цитата
                          Соответственно у помещения должно быть больше характеристик,


                          Я добавили только те данные, которые мне дали. Нахожусь строго в русле выданного мне материала характеристик.


                          Цитата
                          А вот схемы до сих пор нет


                          Схема полностью соответствует Вашим рекомендациям с таблицами связи. Например, в первом посте этого топика на картинке такой таблицей для связи комнат и помещений служит таблица organizations_rooms

                          Цитата

                          Ну и верно замечено - в форме можно набрать каких угодно галочек ,но пока юзер не нажмет кнопку "сохранить" никаких изменений в БД


                          Мне сказали так: супервизор он один обученный человек. Должно быть так, супервизор ставит галочку и в базе появляется запись связь. Супервизор убирает галочку и в этой записи связи появляется дата, что все помещение уже не принадлежит организации.
                          Я делаю, как мне сказали. :unsure:
                          Просто возникло не удобство, что супервизор при переходе на другую организацию при попытке ставить галочку, если она уже занята, то вызывается мною ShowMessage. Это не удобно тыкать и видеть сообщение. Сказали сделать визуализацию. Если помещение занято, напротив него должна быть запись с названием организации. Сразу понятно, что суда тыкать нет особого смысла – будет ShowMessage и отмена. Если же помещение не занято, то колонке организации просто пусто и сразу понятно, что здесь можно ставить галочку. Эта визуализация и нужна этому одному супервизору.

                          Попробую осознать, что написал Akina и переделать запрос. :rolleyes:
                            Цитата MIF @
                            Нужен LEFT JOIN
                            На собственной шкуре понял, что если в запросе есть данные по ключам из других таблиц, выручают именно джойны.
                              Kitty я просто накидал идею. От конечного результата она далека как соседняя галактика от земли. Это раз.
                              По поводу "сказали" - пользователь по определении дурак уверенный, что он умнее всех. Но если он натыкает галок не туда виновата будет программа. По этому только сохранить.
                              Тем более я уже намекал- все эти присвоения галочек не просто так а на основании договора. У договора есть срок действия, возможны как пролонгация так и досрочное расторжение. По договору формируются финансовые операции. Следовательно если при проектировании БД эти нюансы учтены расширить софт при поступлении таких требований будет очень просто. В теперешней ситуации придется перелопатить все на корню.
                              При этом на всю эту балалайку надо натянуть права доступа.

                              Могу предложить отловить меня в скайпе, посидим порисуем разберем по косточкам вашу задачу. Простите, но то, что вы лепите сейчас даже критиковать не стоит. Очень сырая разработка. Причина- вы бросились писать код не сделав детальную постановку задачи от описания процессов, которые будете "автоматизировать" до макетов экранных форм должно быть прорисовано на бумаге. И только потом код.

                              Добавлено
                              Да, если помещение занято то варианты
                              - его просто не должно быть в списке
                              - если выкручивают руки и требуют то кликабельной "галки" в этой строке не должно быть
                                Цитата Павел Калугин @
                                Причина- вы бросились писать код не сделав детальную постановку задачи от описания процессов, которые будете "автоматизировать" до макетов экранных форм должно быть прорисовано на бумаге. И только потом код.

                                Да её уже вторую тему в это носом тыкают, тыкают... процедурщик...

                                Добавлено
                                Цитата Kitty @
                                Должно быть так, супервизор ставит галочку и в базе появляется запись связь. Супервизор убирает галочку и в этой записи связи появляется дата, что все помещение уже не принадлежит организации.

                                Значит, будете каждому чекбоксу свой код рисовать.

                                Цитата Kitty @
                                Я делаю, как мне сказали.

                                Есть такая шутка: компьютер глуп, потому что делает то, что ты скажешь, а не то, что ты хочешь.


                                Цитата Kitty @
                                при переходе на другую организацию при попытке ставить галочку, если она уже занята, то вызывается мною ShowMessage. Это не удобно тыкать и видеть сообщение. Сказали сделать визуализацию. Если помещение занято, напротив него должна быть запись с названием организации. Сразу понятно, что суда тыкать нет особого смысла – будет ShowMessage и отмена.

                                Если помещение занято другой организацией - чекбокс вообще должен быть нахрен заблокирован от изменения!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0858 ]   [ 19 queries used ]   [ Generated: 28.04.24, 05:28 GMT ]