2013-05-15 45 views
0

我有simliar數據到下面的4行,從這個〔實施例我只希望兩行使用以下邏輯返回大約500行:MySQL的邏輯,其中功能我想

如果 = 2 is_active 0則返回817 sal_id 1 OR IF = 2 is_active 1然後返回820 sal_2

所以sal_id 1總是默認激活和sal_id 2應當代替返回的sal_id 1如果is_active是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 | 
+--------+--------+-----------+----------------+-----------+ 

不知道這甚至可以做到,請告知和感謝。

+0

如果我理解正確,您正在尋找從每個'emp否'組返回活動記錄?但是,在上面的'emp No = 820'的情況下,爲什麼兩個記錄都處於活動狀態,爲什麼要返回'sal_id = 2'而不是'sal_id = 1'?那麼沒有活躍記錄的情況下(未顯示)呢? – eggyal

+0

每位員工總是有兩個'sal_id',或者可能有任何數量? – Aya

+0

是的,每個員工的活動記錄但sal_id記錄2處於活動狀態應該返回,而不是sal_id 1,這也將是活動的....是的,有兩種類型「薪水」= 1和「小時」= 2所有員工將有一個工資值作爲活動,但大約一半將按小時支付,並且將具有1和2的有效記錄ID,但是在這種情況下僅應該返回ID 2 –

回答

0

假設數據存儲在employee_salary這是一個骯髒的黑客;

select es.emp_no, es.sal_id, value, effective_date, is_active from employee_salary es 
join ( 
    select emp_no, max(sal_id) as sal_id from employee_salary 
     where is_active<>0 
     group by emp_no 
) selector 
where es.emp_no=selector.emp_no and es.sal_id=selector.sal_id 

限制:

  • 這是不容易改變從2默認爲1無需重寫SQL。
  • 我不清楚這種方法如果數據不在表中,而是來自SELECT的結果,而不是使用臨時表,這種方法將如何應用。
  • 可能無法處理對於sal_id=1sal_id=2作爲您需要,當前沒有結果返回該emp_no,這是你想要的?
  • 正如Aya所指出的那樣,這會生成一個臨時表,然後它會在不使用索引的情況下對其進行排序,預計這會很慢。
0

該解決方案比馬可更詳細的,而應該是更有效,因爲它避免了使用臨時表...

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 |    | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 

...比較d馬克的...

+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+ 
| 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條款爲你實際上並不需要的值。

+0

謝謝看起來不錯,幾乎在那裏,但只有1條記錄sal_id = 1,這不是記錄的結果! –

+0

@John您能否提供一些示例數據? –

+0

@JohnOwen適合我。查詢通過將每個員工的'sal_id = 1'和'sal_id = 2'記錄加入到一行中,爲此,'LEFT JOIN'將爲加入的sal_id = 2部分生成NULL值數據如果沒有匹配的記錄。如果它的'is_active'是'1'(即不是'0'或'NULL'),它只返回'sal_id = 2'的值,否則它會返回'sal_id = 1'的值,而不管他們的價值。正如Mark所建議的那樣,如果您爲失敗的案例提供了一些示例數據,並且包含來自「SHOW CREATE TABLE」的模式也會有所幫助,這會有所幫助。 – Aya