【问题标题】:Select an SQL value from column where separate column is MIN()从单独列为 MIN() 的列中选择 SQL 值
【发布时间】:2016-02-08 19:56:48
【问题描述】:

我正在为订单开发一个分配功能,并尝试将订单分配给待处理请求最少的用户。我想获取所有用户中pending 值最小的用户ID。

例子:

userID    pending
------    -------
0         3
1         0 <----This user has the least pending of all
2         4

如何设置 SQL Query 以返回表中待处理请求数量最少的用户 ID?

$sql="SELECT user_id FROM writerdata_tb WHERE pending = '//Minimum pending here//' LIMIT 1";
$assign = $conn->query($sql);
$row = $assign->fetch_assoc();

【问题讨论】:

  • ORDER BY pending ASC 并且超过该限制 1
  • 我觉得你可以拥有不止一个,实际上,不是吗?
  • 如果有 2 个用户和 0 未决,会发生什么?全选还是只选一个?
  • 我把它限制为只有一个,这样每个订单请求都会被最后一个待处理的人平均分配
  • 看看 here 有一个 Simone Nigro 在评论中写的查询,以及你选择所有有 min 未决用户的查询..

标签: php mysql mysqli min


【解决方案1】:

提出的各种可能答案的比较:

EXPLAIN SELECT aa.userId, aa.pending
FROM writerdata_tb AS aa
INNER JOIN writerdata_tb AS bb 
ON aa.userId = bb.userId
WHERE aa.pending >= bb.pending
ORDER BY aa.pending ASC
LIMIT 1;

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  aa  ALL     PRIMARY     NULL    NULL    NULL    4   Using temporary; Using filesort
1   SIMPLE  bb  ALL     PRIMARY     NULL    NULL    NULL    4   Using where; Using join buffer (Block Nested Loop)

EXPLAIN SELECT userId, pending
FROM writerdata_tb
WHERE pending = (
    SELECT MIN(pending)
    FROM writerdata_tb 
);

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   PRIMARY     writerdata_tb   ALL     NULL    NULL    NULL    NULL    4   Using where
2   SUBQUERY    writerdata_tb   ALL     NULL    NULL    NULL    NULL    4   NULL

EXPLAIN SELECT userId, pending
FROM writerdata_tb
ORDER BY pending ASC
LIMIT 1;

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  writerdata_tb   ALL     NULL    NULL    NULL    NULL    4   Using filesort

EXPLAIN SELECT t.userId
FROM writerdata_tb AS t
GROUP BY (
    t.userId
)
ORDER BY SUM(pending) ASC
LIMIT 1;

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  t   index   PRIMARY     PRIMARY     4   NULL    4   Using temporary; Using filesort

【讨论】:

    【解决方案2】:

    您可以按列 pending 对结果进行排序(有关查询,请参阅 Simone Nigro 的评论)。使用 limit 字,在结果中您将只得到第一行,在这种情况下,您将得到具有最小挂起值的结果。

    我现在看到 Aleksandar Miladinovic 的情况,如果表中有许多行具有相同的 pending 值:您可以执行:

    1. 获取待处理列的最小值
    2. 的查询
    3. 使用上一步获得的值来接收具有该值的行

      SELECT user_id FROM writerdata_tb WHERE pending=(SELECT min(pending) FROM writerdata_tb)

    【讨论】:

    • 我记得在嵌套查询中读过一些东西,我假设如果我使用 LIMIT 它应该只从我使用的任何方法返回一个值?选择所有用户并通过挂起的值升序对它们进行排序并使用第一个用户的值会更容易吗?
    【解决方案3】:

    试试这个方法:select userID from writerdata_tb where pending = (select min(pending) from writerdata_tb);

    【讨论】:

      【解决方案4】:

      如果用户 ID 重复

      SELECT
          t.userID
      from 
          tasks as t
      group by (t.userID)
      order by sum(pending) asc 
      limit 1
      

      其他

      SELECT
          t.userID
      from 
          tasks as t
      order by pending asc 
      limit 1
      

      【讨论】:

        猜你喜欢
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多