SQL:提取执行操作的userID

时间:2015-12-31 22:59:12

标签: mysql 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

我希望能够运行一个查询,其中我将排除所有不会以任何操作结束的UserID。

因此我希望看到这个:

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中完成吗?

1 个答案:

答案 0 :(得分:1)

假设action列中的空格为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中的条件更新为WHERE.action!=''

如果您的数据库引擎支持EXISTS,您可以使用它来提高可读性:http://www.techonthenet.com/sql/exists.php。避免IN / NOT IN用于引用许多行的子查询,因为这通常导致执行RBAR(逐行),性能较差。 IN / NOT IN通常保留用于特定的一组值,而不是子查询。

SQL小提琴:http://sqlfiddle.com/#!9/884dd/3