我有一个数据库,想得到这个输出。有人要求我不使用连接和子查询,但我无法通过任何方法做到这一点,所以有人能告诉我有多少种方式,我们可以得到这个输出?表格:输出:注:我的要求是,如果有人通过了所有科目,那么结果应该是通过或不通过。
fzsnzjdm1#
使用聚合和分组方式https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f5d36431c8e62633cd73525cb7a6d366
select sid, min(res) from tablename group by sid
uttx8gqw2#
通过使用join可以满足需求。我正在考虑将“student”作为表名
SELECT s.sid, COALESCE(temp.res, 'F') AS res FROM student s LEFT JOIN (SELECT s1.sid, 'P' AS res FROM `student` s1 WHERE NOT EXISTS (SELECT s2.sid FROM `student` s2 WHERE res = 'F' AND s1.sid = s2.sid)) AS temp ON s.sid = temp.sid GROUP BY s.sid
js4nwp543#
我有一个数据库,想得到这个输出。有人让我不使用join和subquery根据您的样本数据和预期结果,您可以使用 where ```SELECT sid,resFROM TWHERE sub = 'E'
where
编辑 我的要求是,如果有人通过了所有科目,那么结果应该是通过其他人不及格。 如果您的需求限制没有使用 `where` 你可以用 `MIN` 与 `group by` . 因为 `F` 值小于 `P` . 架构(mysql v5.6)
CREATE TABLE IF NOT EXISTS table1 (id int unsigned NOT NULL,sub varchar(6),rev varchar(6)) ;
table1
INSERT INTO table1 VALUES(1,'E','P'),(1,'H','P'),(2,'E','F'),(2,'H','P'),(3,'E','P'),(3,'H','P');
查询#1
SELECT id,MIN(rev)FROM table1GROUP BY id;
db fiddle视图
hgb9j2n64#
为了使其独立于实际字符值,我们可以首先将p/f字符转换为数字。然后我们检查最小值并将结果转换回字母。
SELECT sid, (CASE WHEN MIN(CASE res WHEN 'P' THEN 1 ELSE 0 END) = 1 THEN 'P' ELSE 'F' END) AS res FROM t GROUP BY sid
4条答案
按热度按时间fzsnzjdm1#
使用聚合和分组方式
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f5d36431c8e62633cd73525cb7a6d366
uttx8gqw2#
通过使用join可以满足需求。我正在考虑将“student”作为表名
js4nwp543#
我有一个数据库,想得到这个输出。有人让我不使用join和subquery
根据您的样本数据和预期结果,您可以使用
where
```SELECT sid,res
FROM T
WHERE sub = 'E'
CREATE TABLE IF NOT EXISTS
table1
(id int unsigned NOT NULL,
sub varchar(6),
rev varchar(6)
) ;
INSERT INTO table1 VALUES
(1,'E','P'),
(1,'H','P'),
(2,'E','F'),
(2,'H','P'),
(3,'E','P'),
(3,'H','P');
SELECT id,MIN(rev)
FROM table1
GROUP BY id;
hgb9j2n64#
为了使其独立于实际字符值,我们可以首先将p/f字符转换为数字。然后我们检查最小值并将结果转换回字母。