2011-02-06 65 views
1

我想要做的事:幫助與MySQL選擇查詢

從這些表

--------------------------------- 
name  date  state 
--------------------------------- 
ali  jan 12 started 

ali  jan 12 drop out 

masa  jan 12 registered 

masa  jan 12 started 

sami  jan 12 started 

我想要的結果是

--------------------------------- 
name  date  state 
--------------------------------- 
masa  jan 12  started 

sami  jan 12  started 

所以基本上我想要的是有所有開始用戶沒有退出的人 所以過濾應該基於狀態 謝謝

+1

以及你想過濾掉數據 – 2011-02-06 08:39:29

+0

你應該表現出你已經嘗試已經表明你有什麼用 – 2011-02-06 08:45:41

+0

麻煩我已經嘗試過的東西像什麼類別: SELECT * FROM日誌,其中log.state =開始, log.state!=退出 但它沒有按照我想要的方式工作,因爲它會顯示「ali」作爲開始,即使他不再是(退出) 所以我想要的是顯示啓動的人並仍然開始(沒有退出) 哦,退出日期總是在開始日期之後,但我省略了simplicy的一天,因爲我可以簡單地「分組」並在兩個日期之間添加「有」日期 – Ali 2011-02-06 16:20:12

回答

2

或許大意如下的東西是你所需要的...

SELECT NAME, 
     DATE, 
     STATE 
    FROM MYTAB 
    WHERE STATE = 'Started' AND 
     NOT EXISTS (SELECT * 
         FROM MYTAB MYTAB2 
         WHERE MYTAB2.NAME = MYTAB.NAME AND 
           MYTAB2.STATE = 'Drop Out'); 

這應該讓大家誰開始並沒有輟學。

0
select * from table where state != 'dropped out' 
+0

-1也包括註冊行。 (如果你的sql說'輟學') – 2011-02-06 08:44:43

1
SELECT name, date, state FROM table GROUP BY name HAVING state = 'started'; 

我相信這將消除誰最終退出了人們因爲GROUP BY會把人具有相同的名稱到同一個組,然後消滅他們,一旦他們退出與HAVING聲明。

3

結果示例中的那兩行並不是該日期的唯一啓動人員。

SELECT * FROM table WHERE state = 'started'; 

將返回3行:

--------------------------------- 
name  date  state 
--------------------------------- 

ali  jan 12  started 

masa  jan 12  started 

sami  jan 12  started 

爲了讓您的示例中的兩行,你需要:

SELECT * FROM table WHERE name IN ('sami', 'mesa'); 

更新,添加了這個例子

你可以限制,如果你只需要兩行:

SELECT * FROM table WHERE state = 'started' LIMIT 2;