从另一个表中选择列的最小值

时间:2016-12-14 12:10:14

标签: sql

我有两张桌子:

score_tableplayer_idscore,其中player_id是唯一的

group_tableplayer_idgroup_id,其中player_id是唯一的。

两个表中有大约1000个条目,group_table.group_id

中有两个不同的值
     score_table                 group_table
 ____________________       ____________________       
| player_id    score |     |player_id   group_id|
|                    |     |                    |  
|   0           200  |     |   1            0   |
|   1            1   |     |   3            1   |
|   4            0   |     |   2            0   |
|   3           114  |     |   0            0   |
|   2            9   |     |   4            1   |
|  ...          ...  |     |  ...          ...  |
|  ...          ...  |     |  ...          ...  |

我想选择得分最低的玩家,但必须在group_id 0

基础on this answer,我提出的查询:

SELECT player_id FROM (

      SELECT MIN(st.score) 
      FROM score_table st

      INNER JOIN  group_table gt
      ON  gt.player_id = st.player_id

      WHERE  gt.group_id = 0
      ORDER BY  st.score ASC
     )"

但是,查询构造不正确,结果始终为null

修改

简单" SELECT MAX(st.score) as score FROM score_table pg"确实返回44,这是正确的最高分。我使用类似的查询测试了所有条目,每个条目都是可检索的。 两个表都使用BTREE作为player_id,这在两种情况下都是唯一的。

修改

"SELECT * FROM score_table as st JOIN group_table gt ON pg.player_id = gt.player_id"

后跟var_dump输出一个N条目的文件,其中每个条目包含两个表中的列,正确连接在一起

接受答案

所以问题在于表名的别名。 当我们SELECT MIN(st.score)时,无法使用fetch(PDO::FETCH_NUMERIC)['score']

访问结果

我必须使用['MIN(st.score)']作为密钥。

5 个答案:

答案 0 :(得分:1)

您的查询有错误,因为子查询没有别名。您应该学习如何检查错误,但是您正在调用查询。

但我认为你想要:

  SELECT st.* 
  FROM score_table st INNER JOIN
       group_table gt
       ON gt.player_id = st.player_id
  WHERE  gt.group_id = 0
  ORDER BY st.score ASC
  LIMIT 1;

您指定要选择分数最小的播放器,而不是最小分数。以上内容会返回score_table中的所有内容,但您可以选择所需的任何列。

答案 1 :(得分:0)

尝试更改您的查询,如

SELECT MIN(st.score) 
FROM score_table st
      LEFT JOIN  group_table gt
      ON  gt.player_id = st.player_id
      AND  gt.group_id = 0;

答案 2 :(得分:0)

如果您想获得分数最低的多个玩家

,您可以使用以下查询
joins

如果您只想获得一个播放器,可以将限制1添加到主查询中。

答案 3 :(得分:0)

尝试以下查询:

SELECT st.player_id
FROM score_table st
LEFT JOIN  group_table gt
ON  gt.player_id = st.player_id
WHERE gt.group_id = 0 and st.score IN (SELECT min(st2.score) FROM score_table st2)

答案 4 :(得分:0)

首先,您要合并score_tablegroup_table

然后,您只想从组合表中选择group 0个数据。在排序之后,您想要选择最低分数值。

按照顺序获得结果。

SELECT MIN (st.score) FROM score_table st 
INNER JOIN  group_table gt 
ON st.player_id=gt player_id 
WHERE gt.group_id=0;