我想从此数据集中检索存在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
我不确定我是否相信代码。
答案 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'