Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Сломал голову на ситуации (Abyrvalg) 21/02/2014 - 23:56:24
      Re: Сломал голову на ситуации (Akina) 22/02/2014 - 13:21:16
      Re: Сломал голову на ситуации (Abyrvalg) 22/02/2014 - 15:50:34
      Re: За чё спасиба-то? (Akina) 23/02/2014 - 21:32:56
      Re: Сломал голову на ситуации (Ar) 06/06/2014 - 15:14:51

> Original message text:
> From: Abyrvalg - 21/02/2014 - 23:56:24
> Subject:Сломал голову на ситуации
> -----------------
> Привет тебе, неустрашимый All!
>
> Вводная:
> *) Есть табличка с двумя полями. Для простоты будем считать, что в первом поле - число, во втором - дата.
> *) Оба поля неуникальны.
> *) Притом второе поле может применять значение null. Но только единожды для каждого значения первого поля. Будем считать, к примеру, что поле f2 - это дата закрытия аренды некоего волшебного номера f1. Если для заданного f1 существует значение f2 = NULL, значит, данный f1 используется. Если же все значения f2 для него ненулевые, то значит, данный f1 использовался N раз (N = числу рядов) и в данный момент не используется.
>
> Пример такой таблицы test с полями f1, f2:
>
> 5 2014-01-01
> 8 2014-02-02
> 8 2014-02-20
> 10 2013-12-16
> 10 NULL
> 12 2013-12-23
> 12 2014-01-30
> 12 NULL
> и т.п.
>
> Задача найти все "активные" f1 элементарна: для этого надо всего лишь выселектить те значения, у которых f2 = NULL:
>
> SELECT f1 FROM test WHERE f2 IS NULL
>
> А вот обратная задача - найти все "неактивные" f1 - заставила меня залипнуть. В конце концов, конечно, можно извратиться вложенным запросом "от противного":
>
> SELECT f1 FROM test WHERE f1 NOT IN (SELECT f1 FROM test WHERE f2 IS NULL)
>
> но не оставляет тревожное ощущение корявости и уродливости этой конструкции. Такое ощущение, что есть что-то гораздо более изящное и правильное, а я проглядел...
>
> Подскажите, пожалуйста, развейте сомнения...
>


From: Akina - 22/02/2014 - 13:21:16
Subject:Сломал голову на ситуации
-----------------
Оба запроса выдают дубликаты. Для исправления достаточно тривиального добавления DISTINCT.

Корявости во втором решении нет. Более того, в определённых условиях он может оказаться самым быстрым из всех вариантов.

Решать вторую задачу можно кучей способов. Все они в той или иной мере "кривые". Но кому нужна красивость? нужна эффективность - а они зависит от количества записей, наличия индексов и пр...

Ну вот например другое решение:

SELECT f1 FROM test GROUP BY f1 HAVING MAX(f2 IS NULL)=0;




[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
43150



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |