Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.202.167] |
|
Данный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
PostgreSQL.
Подскажите, пожалуйста, как исправить SQL запрос, чтобы получить данные указанные на прилагаемой картинке. Если убрать AND organizations_rooms.enddata IS NULL, то все равно получаю не то, что надо. Спасибо. Прикреплённый файлUntitled_2.jpg (214,45 Кбайт, скачиваний: 400) |
Сообщ.
#2
,
|
|
|
Ну не лечат тут по фотографиям!
|
Сообщ.
#3
,
|
|
|
Цитата Akina @ Ну не лечат тут по фотографиям! Лечат. Нужен LEFT JOIN к таблице organizations. |
Сообщ.
#4
,
|
|
|
MIF
На самом деле я хотел сказать, что надо описывать задачу, а не просить исправить кривую попытку решения оной. Я тоже предполагаю, что автору надо бы начать изучать сторонние связывания... но стопроцентной убеждённости, что неозвученная автором логика получения результата совпадает со сделанным тобой предположением, нет. |
Сообщ.
#5
,
|
|
|
Akina, может MIF прочитал всю тему
Правильная связь таблиц? |
Сообщ.
#6
,
|
|
|
Bas
Ага, а ещё нашёл в Инете и прочитал биографию топикстартера... есть тема, есть информация в ней, и если ТС не дал ссылки на другие темы - значит, они не имеют отношения к обсуждаемому вопросу, и их учёт может привести к ошибочным предположениям и, соответственно, неверному результату. |
Сообщ.
#7
,
|
|
|
Цитата надо описывать задачу Есть выпадающий список, в котором пользователь выбирает организацию. Помимо этого пользователь видит список всех помещений. Напротив помещений пользователь может ставить галочки. Установка галочки записывает связь в таблицу, что это помещение принадлежит этой организации. Если пользователь снимает галочку, то в поле enddata записывается время окончания эксплуатации этого помещения. Таким образом, это помещение становиться свободным. Допустим, пользователь выбрал организацию №1. Изначально есть, к примеру, три помещения A B C Пользователь поставил галочки у A и B. Теперь пользователь выбрал организацию №2. Мне надо чтобы пользователь видел, что помещения A и B заняты организацией №1. Т.е. мне надо вывести напротив A и B название организации №1. И напротив С вывести пусто. Чтобы видна была общая картина. Помимо всего, надо учесть, что если в помещении B, к примеру, сняли галочку, то оно свободно снова для всех организаций. Попробую исправить этот запрос рекомендацией LEFT JOIN. 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; |
Сообщ.
#8
,
|
|
|
Раз надо вывести все помещения - таблица помещений должна быть слева.
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. При таком подходе настоятельно не советую делать запрос источником данных формы - хлебнёте. Лучше непривязанная форма и программные заполнение и внесение изменений. Ещё лучше - если применение изменений требует нажатия кнопки или подтверждения. |
Сообщ.
#9
,
|
|
|
Цитата Признаком свободности является NULL в полях от таблицы organizations. Прощу прощения не доходит до меня. Признаком свободности вроде как является заполненное поле enddata т.е. если там есть дата окончания эксплуатации то и помещение свободно. На прилагаемой картинке интерфейс программы. Окна отображаются в окне web браузера. То что мне нужно, нарисовала стрелочками. Прикреплённый файлweb.jpg (124,2 Кбайт, скачиваний: 426) |
Сообщ.
#10
,
|
|
|
Цитата Kitty @ Признаком свободности вроде как является заполненное поле enddata т.е. если там есть дата окончания эксплуатации то и помещение свободно. Здрасьте, приехали... В той теме, коя обсуждалась раньше, и на кою дали ссылку, кто-то убеждал нас, что ни история, ни планы на будущее нафиг не нужны. Ну да ладно, либо поля дат заполнены, либо нет. Если НЕ заполнены (вариант 1) - тут всё ясно, помещение свободно. Но если заполнены - то либо срок не истёк, помещение занято (вариант 2), либо срок истёк, но по непонятной причине запись не очищена (вариант 3). Вставляем оператору клизьму за несвоевременное обновление данных, очищаем поля - и вариант 3 волшебным образом оказывается вариантом 1. Не хотите - ну тогда проверяйте не на NULL, а на то, что текущая дата (не) лежит между значениями полей начала и конца аренды помещения. |
Сообщ.
#11
,
|
|
|
Цитата Kitty @ Цитата Признаком свободности является NULL в полях от таблицы organizations. Прощу прощения не доходит до меня. Признаком свободности вроде как является заполненное поле enddata т.е. если там есть дата окончания эксплуатации то и помещение свободно. На прилагаемой картинке интерфейс программы. Окна отображаются в окне web браузера. То что мне нужно, нарисовала стрелочками. Прикреплённый файлweb.jpg (124,2 Кбайт, скачиваний: 426) Маленькое фи Такая форма хороша когда помещений в списке 10. Когда их писят - такая форма неудобна. Соответственно у помещения должно быть больше характеристик, которые надо выносить на панель фильтра. (например тип помещения - торговое, служебное, офис, санузел) Таки мысль с дата с -по приняли, это хорошо. А вот схемы до сих пор нет Это плохо. По ней было бы легко понять что с чем надо связать и по каким критериям выбрать Второй шаг - на форме должен быть выбор даты, на которую смотрим свободные помещения Далее про enddata. Мысль вы поняли не до конца EndData заполнена ВСЕГДА Если договор аренды бессрочный то там что-тио относительно далекое. Например 01.01.2201. (Уверен что к этой дате Ваше ПО никому уже не понадобится, так что можно рассматривать как аналог +бесконечность) Помещение занято если на дату есть запись по помещению где дата между BeginData и EndData, иначе оно свободно Ну и верно замечено - в форме можно набрать каких угодно галочек ,но пока юзер не нажмет кнопку "сохранить" никаких изменений в БД Да и еще одно фи Я бы рекомендовал вернутся к проектированию структуры. Судя по вопросам вы ее не проработали должным образом. |
Сообщ.
#12
,
|
|
|
Цитата Соответственно у помещения должно быть больше характеристик, Я добавили только те данные, которые мне дали. Нахожусь строго в русле выданного мне материала характеристик. Цитата А вот схемы до сих пор нет Схема полностью соответствует Вашим рекомендациям с таблицами связи. Например, в первом посте этого топика на картинке такой таблицей для связи комнат и помещений служит таблица organizations_rooms Цитата Ну и верно замечено - в форме можно набрать каких угодно галочек ,но пока юзер не нажмет кнопку "сохранить" никаких изменений в БД Мне сказали так: супервизор он один обученный человек. Должно быть так, супервизор ставит галочку и в базе появляется запись связь. Супервизор убирает галочку и в этой записи связи появляется дата, что все помещение уже не принадлежит организации. Я делаю, как мне сказали. Просто возникло не удобство, что супервизор при переходе на другую организацию при попытке ставить галочку, если она уже занята, то вызывается мною ShowMessage. Это не удобно тыкать и видеть сообщение. Сказали сделать визуализацию. Если помещение занято, напротив него должна быть запись с названием организации. Сразу понятно, что суда тыкать нет особого смысла – будет ShowMessage и отмена. Если же помещение не занято, то колонке организации просто пусто и сразу понятно, что здесь можно ставить галочку. Эта визуализация и нужна этому одному супервизору. Попробую осознать, что написал Akina и переделать запрос. |
Сообщ.
#13
,
|
|
|
Цитата MIF @ На собственной шкуре понял, что если в запросе есть данные по ключам из других таблиц, выручают именно джойны. Нужен LEFT JOIN |
Сообщ.
#14
,
|
|
|
Kitty я просто накидал идею. От конечного результата она далека как соседняя галактика от земли. Это раз.
По поводу "сказали" - пользователь по определении дурак уверенный, что он умнее всех. Но если он натыкает галок не туда виновата будет программа. По этому только сохранить. Тем более я уже намекал- все эти присвоения галочек не просто так а на основании договора. У договора есть срок действия, возможны как пролонгация так и досрочное расторжение. По договору формируются финансовые операции. Следовательно если при проектировании БД эти нюансы учтены расширить софт при поступлении таких требований будет очень просто. В теперешней ситуации придется перелопатить все на корню. При этом на всю эту балалайку надо натянуть права доступа. Могу предложить отловить меня в скайпе, посидим порисуем разберем по косточкам вашу задачу. Простите, но то, что вы лепите сейчас даже критиковать не стоит. Очень сырая разработка. Причина- вы бросились писать код не сделав детальную постановку задачи от описания процессов, которые будете "автоматизировать" до макетов экранных форм должно быть прорисовано на бумаге. И только потом код. Добавлено Да, если помещение занято то варианты - его просто не должно быть в списке - если выкручивают руки и требуют то кликабельной "галки" в этой строке не должно быть |
Сообщ.
#15
,
|
|
|
Цитата Павел Калугин @ Причина- вы бросились писать код не сделав детальную постановку задачи от описания процессов, которые будете "автоматизировать" до макетов экранных форм должно быть прорисовано на бумаге. И только потом код. Да её уже вторую тему в это носом тыкают, тыкают... процедурщик... Добавлено Цитата Kitty @ Должно быть так, супервизор ставит галочку и в базе появляется запись связь. Супервизор убирает галочку и в этой записи связи появляется дата, что все помещение уже не принадлежит организации. Значит, будете каждому чекбоксу свой код рисовать. Цитата Kitty @ Я делаю, как мне сказали. Есть такая шутка: компьютер глуп, потому что делает то, что ты скажешь, а не то, что ты хочешь. Цитата Kitty @ при переходе на другую организацию при попытке ставить галочку, если она уже занята, то вызывается мною ShowMessage. Это не удобно тыкать и видеть сообщение. Сказали сделать визуализацию. Если помещение занято, напротив него должна быть запись с названием организации. Сразу понятно, что суда тыкать нет особого смысла – будет ShowMessage и отмена. Если помещение занято другой организацией - чекбокс вообще должен быть нахрен заблокирован от изменения! |