Как выбрать всех пользователей, для которых заданные параметры всегда верны - PullRequest
0 голосов
/ 14 января 2012

У меня есть таблица, содержащая пользователей и места, где их видели:

user_id  | latitude | longitude | date_seen
-------------------------------------------
1035     | NULL     | NULL      | April 25 2010
1035     | 127      | 35        | April 28 2010
1038     | 127      | 35        | April 30 2010
1037     | NULL     | NULL      | May 1 2010
1038     | 126      | 34        | May 21 2010
1037     | NULL     | NULL      | May 24 2010

Даты являются обычными временными метками в базе данных; Я просто упростил их здесь.

Мне нужно получить список пользователей, для которых широта и долгота всегда равны нулю. Таким образом, в приведенном выше примере это будет пользователь 1037 - пользователь 1035 имеет одну строку с информацией широты / долготы, а 1038 имеет две строки с информацией широты / долготы, тогда как для пользователя 1037 в обеих строках информация равна нулю.

Какой запрос я могу использовать для достижения этого результата?

Ответы [ 4 ]

3 голосов
/ 14 января 2012
select distinct user_id
from table_name t
where not exists(
    select 1 from table_name t1 
    where t.user_id = t1.user_id and 
    t1.latitude is not null and
    t1.longitude is not null
)

Вы можете прочитать этот запрос: дать мне всех пользователей, которые не установили lat и long, отличные от null в любой строке таблицы.По моему мнению, exists предпочтительнее в таком случае (не существует), потому что даже если сканирование таблицы используется (не оптимальный способ поиска строки), оно останавливается сразу после того, как находит конкретную строку (нет необходимости count всех строк).

Подробнее об этой теме: Существует против.Граф (*) - Битва никогда не заканчивается ... .

1 голос
/ 14 января 2012

Попробуйте, это должно работать.

    SELECT user_id, count(latitude), count(longitude) 
    FROM user_loc 
    GROUP BY user_id HAVING count(latitude)=0 AND count(longitude)=0;

протестировано в MySQL.

0 голосов
/ 14 января 2012

Это работает:

SELECT  DISTINCT user_id
FROM    table
WHERE   latitude  IS NULL
    AND longitude IS NULL
    AND NOT user_id IN
        (SELECT  DISTINCT user_id
         FROM    table
         WHERE   NOT latitude  IS NULL
             AND NOT longitude IS NULL)

результат:

1037

(синтаксис проверен с помощью SQLite здесь)

НО: даже если здесь не используется COUNT, мое утверждениеприходится сканировать все строки таблицы, поэтому заявление Михаила Повага более эффективно.

обоснование:

  • получить список user_ids с записями lat / lon для сравнения (вы хотите ИСКЛЮЧИТЬ этииз конечного результата) - оптимизация: используйте EXISTS здесь ...
  • получить список user_ids без записей lat / lon (которые вас интересуют)
  • уменьшить на все идентификаторы, которые существуют впервый список - оптимизация: используйте EXISTS здесь ...
  • make user_ids DISTINCT, потому что в примере показано несколько записей на user_id (но вам нужны только уникальные идентификаторы)
0 голосов
/ 14 января 2012

Попробуйте:

SELECT * FROM user WHERE latitude IS NULL AND longitude IS NULL;

- Изменить -

2-я попытка (не проверена, но построена из запроса, который я использовал ранее):

SELECT user_id, CASE WHEN MIN(latitude) IS NULL AND MAX(latitude) IS NULL THEN 1 ELSE 0 END AS noLatLong FROM user GROUP BY user_id HAVING noLatLong = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...