Php 查询3个表和一个最大值

Php 查询3个表和一个最大值,php,mysql,Php,Mysql,我有以下表格: Table "Questoes"; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11)

我有以下表格:

Table "Questoes";
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| id_quest | int(11)      | NO   |     | NULL    |                |
| questao  | varchar(255) | NO   |     | NULL    |                |
| nivel    | int(11)      | NO   |     | NULL    |                |
| tipo     | varchar(255) | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

Table "Resultados";

+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| id_user   | int(11) | NO   | MUL | NULL    |                |
| nivel     | int(11) | NO   |     | NULL    |                |
| pontuacao | int(24) | NO   |     | NULL    |                |
| data      | date    | NO   |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+

And table "utilizador";
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id_user   | int(11)      | NO   | PRI | NULL    | auto_increment |
| id_tipo   | int(11)      | NO   |     | 1       |                |
| username  | varchar(50)  | NO   | UNI | NULL    |                |
| password  | varchar(20)  | NO   |     | NULL    |                |
| nome      | varchar(50)  | NO   |     | NULL    |                |
| email     | varchar(100) | NO   |     | NULL    |                |
| data_nasc | text         | NO   |     | NULL    |                |
| e_valido  | smallint(6)  | NO   |     | 0       |                |
+-----------+--------------+------+-----+---------+----------------+
我需要的是“resultados”表中每个级别(字段“nivel”)的最高分数(字段“pontuacao”)给最佳玩家。 要获得玩家姓名,将通过表“resultados”中的字段“id_user”

我有这个,但不起作用:

SELECT u.id_user, MAX(u.pontuacao), u.nivel, u.data, l.nivel, r.id_user, r.username
FROM questoes l, resultados u, utilizador r
WHERE u.nivel = l.nivel AND r.id_tipo=1 AND u.id_user=r.id_user
GROUP BY u.nivel    

它不起作用,因为您依赖的是一个MySQL扩展,它不能实现您所期望的功能。使用
分组依据
时,只需确保
选择
中的所有列都已聚合或在
分组依据

您想要的更像:

SELECT u.id_user, r2.pontuacao, u.nivel, u.data, l.nivel, r.id_user, r.username
FROM questoes l join
     resultados u
     u.nivel = l.nivel join
     utilizador r 
     on u.id_user = r.id_user join
     (select r2.nivel, max(r2.pontuacao) as maxp
      from resultados r2
      group by r2.nivel
     ) r2
     on u.nivel = r2.nivel and u.pontuacao = r2.maxp
WHER r.id_tipo = 1
GROUP BY u.nivel;

这将作为子查询计算最大值,然后将其重新加入。在此之后,您可能不需要分组依据。此外,我还修复了连接,因此它们使用正确的ANSI语法。

当你说它不起作用时,你是什么意思?它会抛出错误吗?给出意外的结果?您必须在最后的group by中包含除
u.pontuacao
之外的所有字段…运行查询时得到什么?值​​你说的不对。我已经正确回答了用户“StevieG”。泰伊正要发布几乎完全相同的东西。:)
SELECT u.id_user, r2.pontuacao, u.nivel, u.data, l.nivel, r.id_user, r.username
FROM questoes l join
     resultados u
     u.nivel = l.nivel join
     utilizador r 
     on u.id_user = r.id_user join
     (select r2.nivel, max(r2.pontuacao) as maxp
      from resultados r2
      group by r2.nivel
     ) r2
     on u.nivel = r2.nivel and u.pontuacao = r2.maxp
WHER r.id_tipo = 1
GROUP BY u.nivel;