|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Привет. Есть 2 таблицы: Люди и Перемещение . В первой - ФИО, паспортные данные. Во второй - перемещение между хозяйствами (как-то так - связано с похкнигой, кажется - сам не видел). Причем в Перемещение есть логическое поле умер или нет. Связь: Люди .id--> Перемещение .f_id. Цель: вывести все записи из Люди , которые не умерли. Проблема: не для всех людей есть записи в Перемещение . Схема: 1. выбрать из Люди все записи, для которых в Перемещение есть записи. 2. выбрать (по рез-ту 1) из Перемещение все записи, где поле статус равно true (жив) Реализовать схему так: Код: plaintext 1. 2. 3.
или тут есть подводные камни и нужно подзапросом (без понятия как)? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 13:04 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
BananasПривет. Есть 2 таблицы: Люди и Перемещение . В первой - ФИО, паспортные данные. Во второй - перемещение между хозяйствами (как-то так - связано с похкнигой, кажется - сам не видел). Причем в Перемещение есть логическое поле умер или нет. Связь: Люди .id--> Перемещение .f_id. Цель: вывести все записи из Люди , которые не умерли. Проблема: не для всех людей есть записи в Перемещение . Схема: 1. выбрать из Люди все записи, для которых в Перемещение есть записи. 2. выбрать (по рез-ту 1) из Перемещение все записи, где поле статус равно true (жив) Реализовать схему так: Код: plaintext 1. 2. 3.
или тут есть подводные камни и нужно подзапросом (без понятия как)? Код: plaintext 1. 2. 3.
Только нужно ещё одно условие по перемещениям - это дана или последняя дата перемещения иначе выскочат все исторические перемещения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 13:14 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Разве если нет перемещения для человека, то он умер? Мне кажется, что без перемещения человек должен попасть в результирующий набор: Я бы сделал так: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 13:17 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Aleksey-KРазве если нет перемещения для человека, то он умер? Мне кажется, что без перемещения человек должен попасть в результирующий набор: Я бы сделал так: Код: plaintext 1. 2. 3.
Алексей, с Where получится inner join Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 13:43 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
PaulWistAleksey-KРазве если нет перемещения для человека, то он умер? Мне кажется, что без перемещения человек должен попасть в результирующий набор: Я бы сделал так: Код: plaintext 1. 2. 3.
Алексей, с Where получится inner join Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Ну тогда так: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 13:59 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Aleksey-K, да, еще этот момент не учел. Выводить всех людей, у которых вообще нет перемещений, либо при последнем перемещении они были живы. PaulWist, точно, про даты не подумал. Max'ом можно определить последнюю дату? Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 14:20 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Не видел ответов. А одним запросом такое можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 14:22 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Как правило, при составлении запросов достаточно четко сформулировать что именно вы хотите запросить. Примерно так: Отобразить список всех людей для которых не указан признак, что они умерли. Т.е. отобразить всех живых людей. Список людей - это таблица "Люди". А зачем нужна таблица "Перемещение"? Чтобы найти по ней признак того, что человек умер. Надо ли искать в таблице "Перемещение" все остальные записи для подтверждения того факта, что человек живой? Нет, конечно! Если нет признака, что человек умер, значит он все еще жив. Следовательно, из таблицы "Перемещение" надо всего-лишь получить подтверждение того факта, что в ней НЕТ записи с признаком "умер". Т.е. очевидно, что это NOT EXISTS(). Код: plaintext 1. 2. 3. 4. 5.
На всякий случай напомню, что если одной записи из таблицы "Люди" соответствует несколько записей из таблицы "Перемещение", то в результате объединения по JOIN вы получите дубли, которые потом придется отсекать по DISTINCT. Что, собственно, и было сделано в приведенных примерах. При использовании NOT EXISTS() такой проблемы нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 14:26 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
ВладимирМКак правило, при составлении запросов достаточно четко сформулировать что именно вы хотите запросить. Напишу требования четче: Вывести всех людей 1. у которых нет ни одного перемещения (это значит, что они живы) 2. у которых последнее перемещение со статусом жив. ВладимирМ Надо ли искать в таблице "Перемещение" все остальные записи для подтверждения того факта, что человек живой? Нет, конечно! Если нет признака, что человек умер, значит он все еще жив. Понял, с "хронологией" перестарался:) Вопрос: как вписать в запрос условие 1? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 14:41 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Надо ли понимать эти условия так, что может быть несколько перемещений, причем статусы "мертв" и "жив" могут идти в перемешку? Т.е. сначала переместили "метрв", потом переместили "жив", потом опять переместили "мертв"? Я это к чему спрашиваю? Если после перемещения "метрв" не может появится никакого другого перемещения, то это одна ситуация. Если может быть несколько перемещений со статусом "мертв" - это другая ситуация. Если статусы могут идти в перемешку, то это третья ситуация. Если рассматривается сиуация, что перемещение со статусом "мертв" может быть только одно и после него уже не может быть никаких перемещений, то решение "в лоб" будет выглядеть так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Первый NOT EXISTS() контролирует факт отстутствия перемешения со статусом "мертв", а второй EXISTS() контролирует факт существования хотя бы одного перемещеният вне зависимости от статуса. Т.е. условие читается так: есть перемещение, но среди всех перемещений нет перемещения со статусом "мертв" Если надо задействовать еще диапазон дат, то принципиально важным является ответ на вопрос об изменении статуса во времени. Какой статус за каким может оказаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 15:51 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Bananas Цель: вывести все записи из Люди , которые не умерли. 1. у которых нет ни одного перемещения (это значит, что они живы) 2. у которых последнее перемещение со статусом жив. Проблема: не для всех людей есть записи в Перемещение . А может так ??? Выведем людей которые перемещались и никогда не имели статуса умер и людей которые никогда не перемещались: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2009, 16:22 |
|
как написать запрос: через AND или подзапросом?
|
|||
---|---|---|---|
#18+
Bananas, Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2009, 12:34 |
|
|
start [/forum/topic.php?fid=41&fpage=130&tid=1586575]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 130ms |
0 / 0 |