复杂的sql语句到不同的行

时间:2012-07-31 05:27:37

标签: mysql sql

我有一个简单的表,有4个字段:

indexID
UserID
text_1
IsFinal 

此表格可能包含每个UserID的多个值,而IsFinal字段只能包含一个值1或0。

我要做的是创建一个select语句,如果IsFinal只等于0,将返回用户ID。问题可能是同一个userID有多个记录,有些记录有{{1} }等于0且只有1 IsFinal等于1。

我的问题在于:对于每个IsFinal,如果它有UserID的记录,我想忽略具有相同Isfinal = 1的所有记录,否则我想要返回它记录。我不知道是否只能通过SQL语句来完成。

3 个答案:

答案 0 :(得分:2)

好像你想要反连接,即首先需要确定哪些用户ID有IsFinal = 1,然后使用该结果集返回所有用户ID 不< / em>在该列表中。

有多种方法可以实现反连接。

  1. NOT IN

    SELECT *
    FROM atable
    WHERE UserID NOT IN (
      SELECT UserID
      FROM atable
      WHERE IsFinal = 1
    );
    
  2. NOT EXISTS

    SELECT *
    FROM atable t1
    WHERE NOT EXISTS (
      SELECT *
      FROM atable t2
      WHERE t1.UserID = t2.UserID
        AND t2.IsFinal = 1
    );
    
  3. LEFT JOIN + WHERE IS NULL

    A)

    SELECT *
    FROM atable t1
      LEFT JOIN (
        SELECT *
        FROM atable
        WHERE IsFinal = 1
      ) t2 ON t1.UserID = t2.UserID
    WHERE t2.UserID IS NULL;
    

    b)中

    SELECT *
    FROM atable t1
      LEFT JOIN atable t2
        ON t1.UserID = t2.UserID AND t2.IsFinal = 1
    WHERE t2.UserID IS NULL;
    
  4. 可能会发生这样的情况:它们在您的数据库中同样有效,但是测试它们中的每一个仍然可能是一个好主意,至少要避免最终会遇到性能比其他数据更差的数据。

答案 1 :(得分:0)

我认为这就是你要找的东西:

SELECT a.*
FROM translations a
     INNER JOIN (SELECT UserID FROM translations WHERE IsFinal = 1) b
        ON a.UserID = b.UserID
WHERE IsFinal = 0;

答案 2 :(得分:0)

尝试(未测试)

SELECT t1.* FROM table t1
INNER JOIN table t2 USING(indexID)
WHERE t1.IsFinal <>1
GROUP BY t1.UserID