Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

instrução sql complexa para linhas diferentes


Parece que você quer um anti-join , ou seja, primeiro você precisa estabelecer quais IDs de usuário têm IsFinal = 1 , use esse conjunto de resultados para retornar todos os IDs de usuário não nessa lista.

Existem várias maneiras de implementar um anti-join.

  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;
    

Pode acontecer que eles sejam igualmente eficientes em seu banco de dados, mas ainda pode ser uma boa ideia testar cada um deles para pelo menos evitar acabar com um que tenha um desempenho pior que os outros.