2013-06-18 74 views
0

我需要幫助編寫sql查詢以便根據狀態查找記錄。我創建了一個表使用此查詢:Sql根據狀態查詢唯一記錄

CREATE TABLE inglogs (id int, mobileno int(10), status varchar(10)); 
INSERT INTO inglogs (id, mobileno, status) 
VALUES 
(1, 1234, 'fail'), 
(2, 1234, 'fail'), 
(3, 1234, 'success'), 
(4, 2345, 'success'), 
(5, 2345, 'success'), 
(6, 4326, 'fail'), 
(7, 4327, 'success') 

我想從上面的表,來查詢並獲得不同的mobileno像1234,2345,4326,4327與其地位一樣,如果沒有與該mobileno任何成功,應儘可能返回的ID記錄和狀態,並且如果沒有任何移動設備的成功(in my case it is 4326),那麼它也應該在執行的查詢中可見。

例如,我想一些事情是這樣的:

+---+ +--------+ +----------+ 
|id | |mobileno| | status | 
+---+ +--------+ +----------+ 
|3 | | 1234 | | success | 
|5 | | 2345 | | success | 
|6 | | 4326 | | fail | 
|7 | | 4327 | | success | 
+---+ +--------+ +----------+ 

請幫助我。

回答

2

你想要的聚集體與條件:

select max(id) as id, mobileno, 
     (case when sum(status = 'success') > 0 then 'success' else 'fail' end) as status 
from inglogs 
group by mobileno 

看到sqlfiddle

http://sqlfiddle.com/#!2/e71e7/3

+0

謝謝您的幫助,它解決了我的問題。 –

0

你可以粗略地做到這一點有: -

SELECT MAX(id), mobileno, MAX(status) 
FROM inglogs 
GROUP BY mobileno 

儘管這是依靠成功大於失敗(例如,如果你的狀態是'不確定' WN」,以及它會失敗)

或使用子查詢: -

SELECT MAX(id), mobileno, CASE WHEN sub1.mobileno IS NULL THEN 'fail' ELSE 'success' END AS status 
FROM inglogs a 
LEFT OUTER JOIN (SELECT mobileno, COUNT(*) FROM inglogs WHERE status = 'success' GROUP BY mobileno) sub1 
ON a.mobileno = sub1.mobileno 
GROUP BY mobileno