根据列和SQL中的两个条件选择不同的行

时间:2018-06-26 17:29:48

标签: mysql sql

我想从此数据集中检索存在T1 / T3值,但不存在对应ID的T2 / T3值的行。

ID  sample1 sample2 value
A_000002    T2  T3  -0.934119
A_000002    T1  T3  -0.866637
A_000029    T2  T3  -1.07677
A_000037    T2  T3  -0.76506
A_000057    T1  T3  -5.34988

我想说些类似的话:

SELECT * FROM table
WHERE DISTINCT ID
AND sample_1 == "T1"
AND sample_2 == "T3"

...并仅返回以下内容,因为该ID没有对应的T2 / T3行:

A_000057    T1  T3  -5.34988

如果我使用sample_1和sample_2条件,无论如何我都会得到不同的值,因为它会在检查ID是否不同之前过滤掉“ T2”值。

我最接近的是用可能的T1 / T2 / T3组合制作3张桌子,并筛选出NOT EXISTS T1T2.ID = T2T3.ID

select * from T1T2
where not exists (select * from T2T3 where T2T3.id = T1T2.id)
and not exists (select * from T1T3 where T1T3._id = T1T2.id)
order by id

我不确定我是否相信代码。

4 个答案:

答案 0 :(得分:1)

您可以使用not exists

select t.*
from table t
where (sample1 = 'T1' and sample2 = 'T3') and
       not exists (select 1 
                   from table t1 
                   where t1.id = t.id and 
                         t1.sample1 = 'T2' and t1.sample2 = 'T3'
                  );

答案 1 :(得分:0)

您可以基于外部联接使用此技术:

select t1.*
from table t1
left join table t2
on t2.id = t1.id
  and t2.sample1 = 'T2' and t2.sample2 = 'T3'
where t1.sample1 = 'T1' and t1.sample2 = 'T3'
and t2.id is null

之所以可行,是因为如果没有联接,则外部联接返回null,而您仅通过t2.id is null子句中的where条件返回null。

该技术的最大优点是有效利用id列上的索引;该技术通常会胜过其他方法。再加上恕我直言,这是一个更整洁的查询。

请注意,sample列的条件必须为t2 join 条件,否则您将有效地获得 inner 加入,击败所需的外部加入。

答案 2 :(得分:0)

我会使用try { $pdo = new PDO($dsn, DB_USERNAME, DB_PASSWORD); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Could not connect to database. " . $e->getMessage()); } $user = mysqli_real_escape_string($link, $_POST['user']); $pass = mysqli_real_escape_string($link, $_POST['pass']); $account_Type = account_type($user); if ($account_Type == "student") { $query = "SELECT id, password FROM students WHERE sid = :user"; } else if ($account_Type == "teacher") { $query = "SELECT id, password FROM staff WHERE email = :user"; } $stmt = $pdo->prepare($query); $stmt->execute([ ':user' => $user ]);

not exists

答案 3 :(得分:-1)

这里会偷偷摸摸地工作:

从表中选择不同的ID * 其中sample1 ='t1'和sample2 ='t3'