我确实有一些课程可供学生注册。有一个用户表(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中有可能吗?
在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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。