我有大约500行,相似的数据到下面的4行,从这个示例中,我只希望使用以下逻辑返回两行:

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

因此,默认情况下sal_id 1始终处于活动状态,如果sal_id为1,则应返回sal_id 2而不是is_active 1,希望这是有意义的!

+ -------- + -------- + ----------- + ------------------- ---- + ----------- +
| emp否| sal_id |价值|有效日期| is_active |
+ -------- + -------- + ----------- + ------------------- ---- + ----------- +
| 817 | 1 | DED914E3B | 2013年1月4日| 1 |
| 817 | 2 | 0 | 0 | 0 |
| 820 | 1 | 8238942BE | 2013年2月4日| 1 |
| 820 | 2 | EA42574E4 | 2013年2月4日| 1 |
+ -------- + -------- + ----------- + ------------------- ---- + ----------- +


给我以下结果:

+ -------- + -------- + ----------- + ---------------- +- --------- +
| emp否| sal_id |价值|有效日期| is_active |
+ -------- + -------- + ----------- + ---------------- +- --------- +
| 817 | 1 | DED914E3B | 2013年1月4日| 1 |
| 820 | 2 | EA42574E4 | 2013年2月4日| 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 |
+--------+--------+-----------+----------------+-----------+


...而产生的解释...

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 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 - 我认为函数的MySQL逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16568837/

10-09 14:34