mysql在一个表中再次选择两次

时间:2017-01-10 00:04:41

标签: mysql

如何在下面的1个查询中选择。此查询需要重新搜索,以便为自己的循环找到值。

这与其他子查询不同,仅使用1个表

TAble T

| num| WHOSE        
|  1 | A      
|  1 | C   
|  2 | B    
|  2 | C    
|  3 | D

匹配记录(条件)的标准:

  1. num 中的值与条件1中另一条记录的值不匹配。
  2. 我想在 num 列中找到值3的记录(对于列,其中有D)。

    select * from T where whose <> C and ( num is not one of c's)
    

    1 A不能,因为C有1

    2 B不能因为C有2

    3 D是我想要的,因为它列中的 C 并且在 num 列中共享一个值 列中 C 的记录。

2 个答案:

答案 0 :(得分:0)

首先选择numwhose的记录C。然后选择那些whose不是C的记录,以及num不是子查询中的那些记录。

 Select * from T where whose <> 'C' and num not in (Select Num from T  where whose = 'C' ) 

答案 1 :(得分:0)

获得相同结果的另一种方法是在同一个表上使用LEFT JOIN

SELECT T.* 
FROM T 
LEFT JOIN T t2 on t2.num = T.num and t2.whose = 'C'
WHERE T.whose <> 'C' AND t2.whose IS NULL 

this SQL Fiddle上查看结果为:

|  num  | whose |
|   3   |   D   |

此外,编写查询的类似方法是使用 WHERE 条件中的NOT EXISTS子句,如下所示:

SELECT T.* from T 
WHERE T.whose <> 'C' AND NOT EXISTS (SELECT 1 FROM T t2 WHERE
                                 t2.num = T.num AND t2.whose = 'C') 

this SQL fiddle中查看。

要了解有关EXISTS和LEFT JOIN之间比较的更多信息,请参阅this article。在最后的摘要中,它得出以下结论:

  

MySQL可以优化所有三种方法来做一种NESTED LOOPS ANTI JOIN。   ...   但是,这三种方法生成三个不同的计划,这三个计划由三个不同的代码执行。执行 EXISTS 谓词的代码 30%的效率低于执行index_subquery和LEFT JOIN优化使用Not exists方法的代码。

     

这就是为什么在 MySQL 中搜索缺失值的最佳方法是使用 LEFT JOIN / IS NULL NOT IN 而不是 NOT EXISTS