我有大约 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/