【问题标题】:Select minimum of the column from another table从另一个表中选择列的最小值
【发布时间】:2016-12-14 23:13:41
【问题描述】:

我有两张桌子:

score_table 包含 player_idscore 列,其中 player_id 是唯一的

group_table 包含 player_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中

Base 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

编辑:

simple " 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)'] 作为密钥。

【问题讨论】:

  • 您的查询选择 group_id = 0 的最小分数。而且我认为您不了解 sql 的基础知识...
  • 对不起,我没看懂你写的东西。这个想法是从球员那里返回最高分,但只考虑那些在第 0 组的球员。但不知何故,返回 null :/
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 嘿,使用 phpMyAdmin

标签: sql


【解决方案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 中的所有内容,但您可以选择任何您想要的列。

【讨论】:

  • 查询运行良好,但没有输出。在 pdo 上做通常的准备,在返回的 PDOstatement 上运行执行,从它获取作为数字数组,第 0 个索引。但是从它的vardump中获取null。所有表名/列名都正确,有列可供选择
  • @user7296262 。 . .您问题中的查询缺少派生表上的别名。 MySQL 在这种情况下需要表别名。
  • 谢谢戈登;这确实是别名的问题。在该组中获得最低分数的玩家是否是最有效的方法(可能由 100 000 个客户端并行运行)。限制与最小有什么好处? ——
  • @user7296262 。 . .您的问题明确指出“我想选择得分最低的球员”。 order by/limit 为您提供播放器。 min() 没有。
【解决方案2】:

如果您想获得多个玩家的最低分数,您可以使用以下查询

select player_id from score_table where score = (select min(score) from score_table st join group_table gt on st.player_id =gt.group_id and gt.group_id = 0) 

如果您只想获得一名玩家,您可以在主查询中添加限制 1。

【讨论】:

    【解决方案3】:

    这里首先要组合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;
    

    【讨论】:

      【解决方案4】:

      尝试更改您的查询

      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;
      

      【讨论】:

      • 查询运行,但输出为空
      • @user7296262,在答案中尝试编辑后的查询,看看是否有区别
      • 这个语句的 vardump 对我来说会导致 (1) { [0]=> NULL }。然而,简单的“SELECT MAX(st.score) as score FROM score_table pg”确实返回 44,这是正确的最高分。我已经使用类似的查询测试了所有条目,并且每个条目都是可检索的。两个表都使用 BTREE 作为 player_id,这在两种情况下都是唯一的
      【解决方案5】:

      试试下面的查询:

      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)
      

      【讨论】:

      • vardump 返回 null :/
      猜你喜欢
      • 2017-11-13
      • 2014-03-24
      • 2018-08-25
      • 1970-01-01
      • 2014-10-05
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多