2013-11-09 49 views
1

條件去找尋行重複我有兩個表:MySQL查詢基於與限制

Members: 

id  username  


Trips: 

id member_id  flag_status   created 
        ("YES" or "NO") 

我可以做這樣的查詢:

SELECT 
    Trip.id, Trip.member_id, Trip.flag_status 
FROM 
    trips Trip 
WHERE 
    Trip.member_id = 1711 
ORDER BY 
    Trip.created DESC 
LIMIT 
    3 

,可以給這樣的結果:

id  member_id  flag_status 
8  1711   YES 
9  1711   YES 
10  1711   YES 

我的目標是要知道成員的最後三次旅行是否都有flag_status =「YES」,如果有三個!=「YES」,那麼我不會'不想要它數。

我也希望能夠刪除WHERE Trip.member_id = 1711子句,並讓它爲所有我的成員運行,並給我最後3次全部擁有flag_status =「YES」的成員總數

有沒有想法?

謝謝!

http://sqlfiddle.com/#!2/28b2d

在這種sqlfiddle,當正確的查詢我在尋找的運行,我應該看到的結果,如:

COUNT(Member.id) 
     2 

應該符合兩個成員是成員1和3會員5失敗,因爲他的行程之一具有flag_status =「NO」

+0

在SQLfiddle上放置一個帶有multile member_ids的示例數據表。 –

+0

「我的目標是要知道成員的最後三次旅行是否都有flag_status =」YES「,如果有三個!=」YES「,那麼我不想讓它算。「你的意思是,MySQL應該總是檢查基於日期的最後記錄(DESC)並在flag_status =」Yes「上過濾這三條記錄,或者我誤解了該部分。 –

+0

member_id是成員表的外鍵, – user2278120

回答

2

你可以使用GROUP_CONCAT函數,來獲取所有的由ID升序排列狀態的列表:

SELECT 
    member_id, 
    GROUP_CONCAT(flag_status ORDER BY id DESC) as status 
FROM 
    trips 
GROUP BY 
    member_id 
HAVING 
    SUBSTRING_INDEX(status, ',', 3) NOT LIKE '%NO%' 

然後使用SUBSTRING_INDEX您只能提取最後三個狀態標誌,並排除那些包含NO。請參閱小提琴here。我假設你所有的行都是由ID排序,但如果你有一個創建日期,你應該更好地利用:

GROUP_CONCAT(flag_status ORDER BY created DESC) as status 

爲雷蒙建議。

SELECT COUNT(*) 
FROM (
    ...the query above... 
) as q 
+0

謝謝fthiella!通過修改你的一行到:SUBSTRING_INDEX(status,' ,',3)=「是,是,是」我能夠讓它按照我的需要運作! – user2278120

+0

@ user2278120歡迎您:)是的,它幾乎是相同的,使用「YES,YES,YES」,您將返回所有至少有三個狀態標誌的成員,使用NOT LIKE'%NO%',它會選擇記錄只有一個或兩個「是」 – fthiella

+0

不明白爲什麼這被標記爲正確的,因爲這是假設在身份證上,而不是基於創建(主題起始者想要的,所以這是由 機會的結果是正確的,因爲最有可能關閉AUTO_INCREMENT ID ..)。應該是'GROUP_CONCAT(flag_status ORDER BY創建DESC)作爲狀態' –

2

雖然我很喜歡fthiella的解決方案的簡單,我只是不認爲依賴於數據表示這麼大一個解決方案:那麼,你也可以只返回行的計數使用像返回。爲了不依賴於它,你可以做這樣的事情:

SELECT COUNT(*) FROM (
    SELECT member_id FROM (
    SELECT 
     flag_status, 
     @flag_index := IF(member_id = @member, @flag_index + 1, 1) flag_index, 
     @member := member_id member_id 
    FROM trips, (SELECT @member := 0, @flag_index := 1) init 
    ORDER BY member_id, id DESC 
) x 
    WHERE flag_index <= 3 
    GROUP BY member_id 
    HAVING SUM(flag_status = 'NO') = 0 
) x 

小提琴here。注意我已經稍微修改了小提琴以刪除其中一個用戶。

這個過程基本上是根據他們的id desc對每個成員的旅程進行排名,然後只保留最後3個成員。然後確保沒有任何提取的行程在flag_status中有NO。最後,所有匹配的成員都被計算在內。

+0

嗨Mosty ,感謝您的回覆,但是我無法理解,即使有您的解釋。你可能可以更深入地解釋一下使用mySQL變量的新手嗎?我確實想要對我的實際分貝運行這個,看看它是否比fthiella的解決方案更快,並且根據哪一個更快,我將選擇合適的答案作爲最佳答案。 – user2278120

+0

如果您需要更多關於UDV的信息,您應該閱讀[this one]這樣的教程(http://my.safaribooksonline.com/book/databases/mysql/9780596101718/query-performance-optimization/user-defined_variables) –

+0

您。 :)我會檢查出來。 – user2278120