2015-12-31 3 views
-1

Извинения за заголовок вопроса, но не знают, какая функция может достичь того, что мне нужно.SQL: извлечение идентификаторов пользователей, которые выполнили действие

Для простоты, я ниже таблице:

UserID | date  | action 
---------------------------- 
1  | 1/1/2015 | 
2  | 1/1/2015 | 
2  | 2/1/2015 | 
2  | 3/1/2015 | 
2  | 4/1/2015 | sale 
3  | 2/1/2015 | 
3  | 4/1/2015 | 
4  | 5/1/2015 | 
4  | 7/1/2015 | sale 
5  | 3/1/2015 | sale 
6  | 4/1/2015 | 
7  | 9/1/2015 | sale 

Я хотел бы быть в состоянии выполнить запрос, где я исключит все UserIds, которые не в конечном итоге с каких-либо действий.

Поэтому я ожидал бы увидеть это:

UserID | date  | action 
---------------------------- 
2  | 1/1/2015 | 
2  | 2/1/2015 | 
2  | 3/1/2015 | 
2  | 4/1/2015 | sale 
4  | 5/1/2015 | 
4  | 7/1/2015 | sale 
5  | 3/1/2015 | sale 
7  | 9/1/2015 | sale 

Является ли это то, что может быть сделано в SQL?

+0

'выберите * из таблицы, где Идентификатор_пользователь в (выберите UserID из таблицы, где действие не Null)' – TZHX

+0

@TZHX. Более острой будет 'SELECT * FROM table WHERE UserID IN (SELECT ** DISTINCT ** UserID FROM table WHERE action NOT NOT). – cFreed

+0

@cFreed Я бы подумал, что оптимизатор запросов позаботится об этом. Но я не обычный пользователь MySQL. – TZHX

ответ

1

Предполагая, что пробелы в столбце действия являются NULL, вы можете написать так:!

SELECT 
    u.UserID, 
    u.date, 
    u.action 
FROM 
    (SELECT UserID FROM users WHERE action IS NOT NULL GROUP BY UserID) action_user 
JOIN 
    users u ON u.UserID = action_user.UserId 

Если это на самом деле пустое значение, вы бы обновить критерии в подзапроса action_user, где u.action = ''

Если ваш DB Engine поддерживает EXISTS, вы можете использовать его для лучшей читаемости: http://www.techonthenet.com/sql/exists.php. Избегайте IN/NOT IN для вспомогательных запросов, которые ссылаются на многие строки, поскольку это часто приводит к выполнению RBAR (по ряду строк) с низкой производительностью. IN/NOT IN обычно зарезервированы для определенного набора значений, а не для подзапроса.

SQL Скрипка: http://sqlfiddle.com/#!9/884dd/3

+0

@ vanalee1987 Благодарим вас за ваш запрос (все еще тестирование, у меня 1,2 ГБ DB, поэтому потребуется некоторое время. Чтобы повысить производительность, согласно вашему предложению, я в настоящее время использую локальный сервер (XAMPP) с MySQL. Если это поможет, какие модификации вы использовали бы здесь для ускорения запроса? – Chriser

+0

Я бы поставил кластерный индекс в вашу пользовательскую таблицу, если он еще не существует. Возможно, добавьте вторичный индекс в действие, если таблицы довольно большие – vanlee1987

+0

Будет делать все еще. – Chriser

Смежные вопросы