MySQL逻辑where函数我认为

标签 mysql if-statement logic where-clause

我有大约 500 行,其数据与下面的 4 行相似,从这个例子中,我只想使用以下逻辑返回两行:

如果 emp No 817 sal_id = 2 is_active 0 则返回 817 sal_id 1 或 IF emp No 820 sal_id = 2 is_active 1 然后返回 820 sal_2

因此,默认情况下,sal_id 1 始终处于事件状态,如果 is_active,则应返回 sal_id 2,而不是 sal_id 1 > 是 1,希望这是有道理的!

+--------+--------+-----------+-----------------------+-----------+
| emp No | sal_id |   value   |    effective_date     | is_active |
+--------+--------+-----------+-----------------------+-----------+
|    817 |      1 | DED914E3B | 01/04/2013            |         1 |
|    817 |      2 | 0         | 0                     |         0 |
|    820 |      1 | 8238942BE | 02/04/2013            |         1 |
|    820 |      2 | EA42574E4 | 02/04/2013            |         1 |
+--------+--------+-----------+-----------------------+-----------+

给我一​​个结果:

+--------+--------+-----------+----------------+-----------+
| emp No | sal_id |   value   | effective_date | is_active |
+--------+--------+-----------+----------------+-----------+
|    817 |      1 | DED914E3B | 01/04/2013     |         1 |
|    820 |      2 | EA42574E4 | 02/04/2013     |         1 |
+--------+--------+-----------+----------------+-----------+

不确定这是否可以完成,请提供建议并谢谢。

最佳答案

这个解决方案比 Mark 的更详细,但应该更高效,因为它避免使用临时表...

SELECT
    es1.emp_no,
    IF(es2.is_active=1, es2.sal_id, es1.sal_id) AS sal_id,
    IF(es2.is_active=1, es2.value, es1.value) AS value,
    IF(es2.is_active=1, es2.effective_date, es1.effective_date) AS effective_date,
    IF(es2.is_active=1, es2.is_active, es1.is_active) AS is_active
FROM employee_salary es1
    LEFT JOIN employee_salary es2 ON (es2.emp_no=es1.emp_no AND es2.sal_id=2)
WHERE es1.sal_id=1;

...产生...

+--------+--------+-----------+----------------+-----------+
| emp_no | sal_id | value     | effective_date | is_active |
+--------+--------+-----------+----------------+-----------+
|    817 |      1 | DED914E3B | 01/04/2013     |         1 |
|    820 |      2 | EA42574E4 | 02/04/2013     |         1 |
+--------+--------+-----------+----------------+-----------+

...并且 EXPLAIN 会产生...

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | es1   | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |
|  1 | SIMPLE      | es2   | ALL  | NULL          | NULL | NULL    | NULL |    4 |             |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

...与马克相比...

+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+
| id | select_type | table           | type | possible_keys | key  | key_len | ref  | rows | Extra                                        |
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+
|  1 | PRIMARY     | <derived2>      | ALL  | NULL          | NULL | NULL    | NULL |    2 |                                              |
|  1 | PRIMARY     | es              | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where; Using join buffer               |
|  2 | DERIVED     | employee_salary | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where; Using temporary; Using filesort |
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+

您可以删除任何实际上不需要其值的 IF 子句。

关于MySQL逻辑where函数我认为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16568837/

相关文章:

mysql - 将 mysql 查询应用于数据库中的每个表

php - php 代码中没有报告错误,但没有数据进入数据库

javascript - 多个语句 else 如果不起作用

javascript - 这个或那个等于速记

algorithm - 在递归定义的算法中寻找 g(n)[家庭作业]

mysql - 如何从 Nodejs Mysql 获取 JSON 类型作为 JSON 而不是 String

mysql - 从另一个表更新平均值的触发器

python - 在 python 中缩小非常大的 If 语句

javascript - 查询 if else if else 检查 true 吗?

c# - 可空对象的类