【问题标题】:Fetch even numbered records from employees table从员工表中获取偶数记录
【发布时间】:2017-02-01 05:49:06
【问题描述】:

我通过link 遇到了一个 MySQL 问题。在阅读了下面的答案(也可以在链接中找到)之后,我仍然没有得到它。有人可以为我解释一下这些步骤,尤其是子查询(SELECT @i := @i + 1 AS i, employee_id FROM employees)?提前致谢!

问题:

从员工表中获取偶数记录。

答案:

SET @i = 0; 

SELECT i, employee_id

FROM (SELECT @i := @i + 1 AS i, employee_id FROM employees) a 

WHERE MOD(a.i, 2) = 0;

【问题讨论】:

  • 这会以不确定的方式获取“备用”记录,即数据集的一半。从任何意义上说,它们都不是“偶数”——尽管它们可能碰巧是!
  • 我猜像这样草率的答案(被呈现为某种规范)部分解释了为什么不鼓励将该网站作为该网站上的资源。

标签: mysql sql database subquery


【解决方案1】:

如果你想得到偶数的员工ID,这一切都是不必要的

SELECT employee_id FROM employees
WHERE employee_id%2 = 0;

上述代码的作用是为每个员工分配任意数字。这就是子查询的作用

(SELECT @i := @i + 1 AS i, employee_id FROM employees)

从零开始,使用每行递增一的计数器。但正如@strawberry 在 cmets 中指出的那样,这在这里真的没有任何目的或意义。最好使用employee_id(当然,除非您遇到奇怪的情况,即大多数员工的分布是奇数或偶数,而不是均等分布)

【讨论】:

  • 有道理!
  • 很高兴能帮上忙。祝您的项目一切顺利。
【解决方案2】:
(SELECT @i := @i + 1 AS i, employee_id FROM employees)

这会为获取的每一行增加i 变量的值(可以是任何行,因为这里没有提供顺序)。因此,i 的值将毫无意义。

当您说偶数行时,必须有一些编号顺序。我在这里假设employee_id 是升序的。

在单个查询中使用用户变量:

SELECT 
    *
FROM
    (SELECT 
        e.*, @rn:=IF(@rn IS NULL, 1, @rn + 1) rn
    FROM
        employees e
    ORDER BY employee_id) t
WHERE
    rn % 2 = 0;

【讨论】:

  • 我认为这不能回答问题
  • 非常感谢!我刚刚看到更新,但它有很大帮助!
【解决方案3】:

用于从表中打印偶数行

SELECT * FROM Employee WHERE MOD (Employee_id,2)=0;

用于从表中打印奇数行

SELECT * FROM Employee WHERE MOD (Employee_id,2)<>0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2018-04-30
    • 2017-03-31
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多