Mysql
 sql >> Base de données >  >> RDS >> Mysql

instruction sql complexe sur différentes lignes

On dirait que vous voulez un anti-jointure , c'est-à-dire que vous devez d'abord établir quels ID d'utilisateur ont IsFinal = 1 , puis utilisez cet ensemble de résultats pour renvoyer tous les ID utilisateur pas dans cette liste.

Il existe différentes manières d'implémenter un anti-jointure.

  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;
    

Il se peut qu'ils soient aussi performants dans votre base de données, mais il peut quand même être judicieux de tester chacun d'entre eux pour au moins éviter de se retrouver avec un moins performant que les autres.