Mysql
 sql >> база данни >  >> RDS >> Mysql

сложен оператор sql към различни редове

Изглежда, че искате против присъединяване т.е. първо трябва да установите кои потребителски идентификатори имат IsFinal = 1 , след което използвайте този набор от резултати, за да върнете всички потребителски идентификатори не в този списък.

Има различни начини за прилагане на антиприсъединяване.

  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 :

    а)

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

    б)

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

Може да се случи така, че те ще бъдат еднакво ефективни във вашата база данни, но все пак може да е добра идея да тествате всеки от тях, за да избегнете поне такъв, който работи по-лошо от останалите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Автоматично увеличение не работи за клас Entity със съставен ключ

  2. Указване на име на променлива в клаузата QUERY WHERE в JDBC

  3. Защо не можете да предавате MYSQL функции в подготвени PDO изрази?

  4. mysql date_sub използва поле като интервал

  5. Правилният начин да попитате дали mysql_num_rows в PHP