开发者社区> 问答> 正文

有没有一种方法可以仅针对MySQL中的一个字段显示WHERE子句??mysql

我确实有一些课程可供学生注册。有一个用户表(usuarios),一个课程表(cursos)表和显示每个学生入学人数的第三个表(cursosUsuarios),如下所示:

CREATE TABLE usuarios( userID int unsigned not null auto_increment primary key, userName char(50) null, )ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE cursos ( cursoID int unsigned not null auto_increment primary key, nombreCurso char(100) not null, estadoCurso char(50) not null, )ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE cursosUsuarios ( cursosUsuariosID int unsigned not null auto_increment primary key, userID int not null, cursoID int not null, userHabilitado int(1) not null DEFAULT '0', )ENGINE=InnoDB DEFAULT CHARSET=utf8; 每个用户都可以注册每门课程,但是直到管理员“启用”该用户,该用户才可以访问该课程。启用意味着“ userHabilitado”字段为“ 1”,而不是默认的“ 0”。

现在,我试图在用户的个人资料中显示所有可用课程的列表,以便管理员可以查看用户已注册的课程,并将“ userHabilitado”字段中的“ 0”更改为“ 1”。

这是我的查询:

SELECT cursos.cursoID AS idcurso, cursos.estadoCurso, cursosUsuarios.userHabilitado AS 'ok',
GROUP_CONCAT(cursosUsuarios.userID SEPARATOR ',') AS 'usuarios' FROM cursos LEFT JOIN cursosUsuarios ON cursos.cursoID = cursosUsuarios.cursoID LEFT JOIN usuarios ON cursosUsuarios.userID = usuarios.userID WHERE cursos.estadoCurso='abierto' GROUP BY cursos.cursoID; 这是我得到的结果:

在此处输入图片说明

现在,由于我需要显示所有打开的课程(将estadoCurso字段设置为“ abierto”的课程),因此我没有添加WHERE子句来按用户过滤结果。

我要做的是从URL中获取用户ID,然后展开“ usuarios”字段,以查找所需的用户,如下所示:

            echo '<div class="checkbox">';
            while ($curso=mysqli_fetch_assoc($buscarCurso)) {
                $usuario = $_GET['userID'];
                $usuarios = explode(',', $curso['usuarios']);
            ?>
                <input type="checkbox" 
name="cursoID[]" value=" "> '.$curso['nombreCurso'].' ';?> Estado usuario: ';?> 因此,如果用户ID在$ usuarios数组中,则选中该复选框,因为这意味着该用户已注册。

我的问题是如何在该列表中显示userHabilitado字段。在上图中,用户70已注册三个课程:课程ID 15、16和18。在每种情况下,userHabilitado字段均设置为“ 1”,但那里的结果不正确。

我想替换cursosUsuarios.userHabilitado AS 'ok'为: cursosUsuarios.userHabilitado WHERE usuarios.userID = 70,但在该字段内。

在MySQL中有可能吗?

展开
收起
保持可爱mmm 2020-05-17 20:35:36 1021 0
1 条回答
写回答
取消 提交回答
  • 在MySQL 5.7之前,默认设置是允许non FULL group by。这意味着你可以有一组(使用聚合功能,如sum和max和count和group_concat)与其他非聚合列(让我们称他们NON AGGS)像你的第一个3所示不是所有的部分group by条款。它允许,但是结果通常是这样的:

    它之所以奏效,是因为您非常了解自己的数据,并试图实现独特的

    算是糟糕的事,因为那是个骗子

    5.7之前的版本已ONLY_FULL_GROUP_BY存在,但默认情况下已关闭。

    因此,在MySQL 5.7中,ONLY_FULL_GROUP_BY默认值为ON。因此,如果你试图GROUP BY,但不是所有的NON AGGS中group by条款,你会得到一个错误。

    考虑下面的5.6中的以下问题:

    create table thing ( col1 int not null, col2 int not null, age int not null ); insert thing(col1,col2,age) values (1,2,10), (1,3,20), (2,3,20), (2,2,10);

    select col1,col2,max(age) from thing group by col1; +------+------+----------+ | col1 | col2 | max(age) | +------+------+----------+ | 1 | 2 | 20 | | 2 | 3 | 20 | +------+------+----------+ 上面发生的事情并不是全部NON AGGS在里面group by。它通过col1返回max(age)。但是由于col2不在中group by,它使用了簇索引或物理顺序,并在不经意间(一个天赋,一个错误)为col2带来了错误的值。根据您的意图或了解您的数据甚至是关心。引擎不在乎;也许你愿意。

    为了避免这些常见错误或意外返回数据,MySQL 5.7 ONLY_FULL_GROUP_BY默认情况下处于打开状态。

    在您的情况下,错误的行可能构成了第2列和第3列的结果。

    请参见手册页,标题为MySQL BY GROUP。

    例子2 -- drop table if exists person; create table person ( id int auto_increment primary key, firstName varchar(100) not null, lastName varchar(100) not null );

    -- drop table if exists fruitConsumed; create table fruitConsumed ( id int auto_increment primary key, theDate date not null, fruitId int not null, -- does not really matter. Say, 1=apple, 2=orange from some other table personId int not null, qty int not null );

    -- truncate table person; insert person (firstName,lastName) values ('Dirk','Peters'), ('Dirk','Smith'), ('Jane','Billings');

    -- truncate table fruitConsumed; insert fruitConsumed (theDate,fruitId,personId,qty) values ('2016-10-31',1,1,2), ('2016-10-31',2,1,5), ('2016-10-31',2,2,12), ('2016-11-02',2,2,3); 查询:

    select p.firstName,p.lastName,sum(fc.qty) from person p join fruitConsumed fc on fc.personId=p.id group by p.firstName,p.lastName; +-----------+----------+-------------+ | firstName | lastName | sum(fc.qty) | +-----------+----------+-------------+ | Dirk | Peters | 7 | | Dirk | Smith | 15 | +-----------+----------+-------------+ 无论MySQL的设置如何,以上内容在MySQL 5.6和5.7上均可正常运行 ONLY_FULL_GROUP_BY

    现在考虑

    select p.firstName,p.lastName,sum(fc.qty) from person p join fruitConsumed fc on fc.personId=p.id group by p.firstName;

    +-----------+----------+-------------+ | firstName | lastName | sum(fc.qty) | +-----------+----------+-------------+ | Dirk | Peters | 22 | +-----------+----------+-------------+ 在没有ONLY_FULL_GROUP_BY启用MySQL 5.6的情况下,以上情况通常是可以接受的;在启用5.7的情况下,上述情况会失败ONLY_FULL_GROUP_BY(错误1055)。上面的输出基本上是乱码。但是下面对此进行了一些解释:

    我们知道,德克,一个德克,只有一个德克,是唯一一个幸存于内部联接中的人。有2个德克。但是由于group by p.firstName,我们只剩下一个Dirk。我们需要一个lastName。由于不符合 SQL标准,因此MySQL可以ONLY_FULL_GROUP_BY将其关闭。因此,它只选择任何旧的姓氏。好吧,它找到的第一个,即在高速缓存中还是在物理顺序中。

    彼得斯去了。水果计数总和适用于所有德克。

    因此,如果您这样编码,则不合格的非合格品ONLY_FULL_GROUP_BY会给您带来乱码。

    如前所述,MySQL 5.7出厂默认不允许。但是,如果您选择的话,可以对旧方法进行调整。

    强烈建议您修复查询并保持ONLY_FULL_GROUP_BY启用状态。来源:stack overflow

    2020-05-17 20:46:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像