比较两个SQL表,将cut-set设置为true,否则设置为false

时间:2013-08-29 23:43:01

标签: mysql join

对于我的新项目,我决定在导入之前优化我在旧项目中使用的所有低效SQL查询。几个小时之后我认为这个问题看起来很简单,我感到很茫然。我有两个不同的表持有用户ID

table r     table s
+-----+     +-----+
| user|     | user|
+-----+     +-----+
|  2  |     |  1  |
|  3  |     |  4  |
|  4  |     +-----+
+-----+

我现在想要的是比较两个表并在结果表的另一列中设置true或false标志,该表显示表r中表s的值。所以我想要的只是将cut-set设置为true。结果表应如下所示

     result
+-----+-------+
| user| flag  |
+-----+-------+
|  1  | FALSE |
+-----+-------+
|  4  | TRUE  |
+-----+-------+

因此,用户4是表r中列出的唯一用户。我已经尝试了一些带有IF子句的解决方案,但我不是SQL的专业人员,但我会尽力接近这个目标。我的想法是这个查询

SELECT
    r.user, 
    IF(r.user = s.user, TRUE, FALSE) AS flag
FROM
    r,
    s

我知道它根本不正确,因为查询给了我以下6行。

     result
+-----+-------+
| user| flag  |
+-----+-------+
|  2  |   0   |
+-----+-------+
|  2  |   0   |
+-----+-------+
|  3  |   0   |
+-----+-------+
|  3  |   0   |
+-----+-------+
|  4  |   0   |
+-----+-------+
|  4  |   1   |
+-----+-------+

所以每个用户的最后一行似乎是我想要的结果,但问题是false表与标志组合在一起,每个用户都有两个标志。我不明白什么是错的,如果有人能解释我SQL服务器如何理解我的查询以及我需要更改以获得正确的结果,我将不胜感激

2 个答案:

答案 0 :(得分:1)

您没有加入条件,因此您的查询只是在两个表之间创建笛卡尔积。然后根据用户是否在特定配对中匹配来报告真或假。如果在SELECT子句中包含s.user,则会看到这一点。

要做你想做的事,你应该使用外连接。

SELECT s.user, r.user IS NOT NULL AS flag
FROM s
LEFT JOIN r
ON r.user = s.user

答案 1 :(得分:0)

尝试:

SELECT r.user FROM r,s flag WHERE r.user = s.user