2015-11-06 10 views
6

मैं अपनी तालिका में प्रेषक और रिसीवर के बीच नवीनतम निर्माण तिथि प्राप्त करना चाहता हूं जहां प्रेषक या रिसीवर = 002 और फिर प्रेषक और रिसीवर द्वारा समूह। अंत में यह सूचित करें कि सदस्य 002 के दृश्य से प्रेषक या रिसीवर है या नहीं।MYSQL अधिकतम दिनांक समूह दो कॉलम

यह सिर्फ एक नमूना डेटा है।

तालिका

id sender | receiver |  create_date 
1  001    002   2015-10-13 10:30:01 
2  003    002   2015-11-06 15:30:59 
3  001    002   2015-11-02 05:30:01 
4  001    002   2015-11-03 11:08:22 
5  002    004   2015-10-20 12:15:36 
6  002    004   2015-11-03 17:35:10 
7  002    005   2015-09-01 06:02:20 
8  002    001   2015-11-06 15:10:32 

परिणाम इस

id | member | type |  create_date 
2   003   sender  2015-11-06 15:30:59 
6   004   receiver  2015-11-03 17:35:10 
7   005   receiver  2015-09-01 06:02:20 
8   001   receiver  2015-11-06 15:10:32 

अब तक मैं कोशिश की है की तरह दिखना चाहिए:

1)

SELECT 
    id, 
    IF(sender <> '002', sender, receiver) AS member, 
    IF(sender <> '002', 'sender', 'receiver') AS type, 
    MAX(create_date) AS max_date 
FROM 
    table 
WHERE 
    sender = '002' OR receiver = '002' 
GROUP BY 
    member 

परिणामस्वरूप मुझे अंत में मिला।

id | member | type |  create_date 
1   001   sender  2015-11-06 15:10:32 
2   003   sender  2015-11-06 15:30:59 
5   004   receiver  2015-11-03 17:35:10 
7   005   receiver  2015-09-01 06:02:20 

मैं नवीनतम वर्तमान पंक्ति प्राप्त करने के लिए संघर्ष करता हूं लेकिन create_date के साथ कोई समस्या नहीं है।

2) मैंने आंतरिक भी शामिल होने का प्रयास किया है।

SELECT 
    * 
FROM 
    table a 
INNER JOIN 
(
    SELECT 
     id, 
     MAX(create_date) as max_date 
    FROM 
     table 
    WHERE 
     sender = '002' OR receiver = '002'   
) b ON b.max_date = a.create_date 

यह केवल नवीनतम पंक्ति रिकॉर्ड को पुनर्प्राप्त करने के लिए अच्छी तरह से काम करता है। लेकिन अगर मुझे नवीनतम create_date के साथ पंक्तियों को पुनर्प्राप्त करने की आवश्यकता है लेकिन प्रेषक और रिसीवर द्वारा समूह?

उत्तर

1

संभवतः एक उप क्वेरी का उपयोग सदस्यों और तारीखों के साथ प्रकार की सूची प्राप्त करने के साथ है, तो उस से अधिकतम प्राप्त: -

SELECT member, type, MAX(create_date) 
FROM 
(
    SELECT sender AS member, 'sender' AS type, create_date 
    FROM table 
    WHERE receiver = '002' 
    UNION 
    SELECT receiver AS member, 'receiver' AS type, create_date 
    FROM table 
    WHERE sender = '002' 
) sub0 
GROUP BY member, type 

आईडी एक मामूली समस्या है। आवश्यक तो यह सदस्य/प्रकार के आधार पर तालिका के खिलाफ वापस शामिल होने के लिए की जरूरत है/तिथि बनाकर इसे पाने के लिए, या group_concat के साथ एक बेला कार्य करें: -

SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY create_date DESC), ',', 1), 
     member, 
     type, 
     MAX(create_date) 
FROM 
(
    SELECT id, sender AS member, 'sender' AS type, create_date 
    FROM table 
    WHERE receiver = '002' 
    UNION 
    SELECT id, receiver AS member, 'receiver' AS type, create_date 
    FROM table 
    WHERE sender = '002' 
) sub0 
GROUP BY member, type 
1

यहाँ यह करने के लिए एक बुरी अप्रभावी तरीका है, लेकिन यह सही परिणाम प्राप्त करेंगे:

SELECT id, t.member, COALESCE(IF(sender<>2,'sender',NULL),'receiver') type, t.create_date 
FROM a 
JOIN (
SELECT COALESCE(IF(sender<>2,sender,NULL),receiver) member, MAX(create_date) create_date 
FROM a GROUP BY member 
) t on ((a.sender=t.member or a.receiver=t.member) AND a.create_date=t.create_date) 
WHERE a.sender='002' OR a.receiver='002'; 

इनर उप चयन आप प्रत्येक शामिल सदस्य और के लिए नवीनतम create_date मिलेगा बाहरी चुनिंदा कि विशेष पंक्ति मिलेगा ।

2

आप एक ही चयन में कर सकते हैं एक मामले

select 
case when sender='002' then receiver else sender end as member, -- # knowing that either sender or receiver are 002, take the other. 
case when sender='002' then 'receiver' else 'sender' end as type, 
max(date) 
from table 
where sender = '002' or receiver = '002' 
group by 1,2 
+1

अगर आप की जरूरत नहीं है जाने का रास्ता है 'id'। – vhu

+1

@vhu सच, मुझे याद आया। यदि आप आईडी चाहते हैं तो आपको इसमें शामिल होना होगा। यदि आईडी निर्माण तिथि के समान क्रम में है, तो आप अधिकतम (आईडी) भी ले सकते हैं – AdrianBR

संबंधित मुद्दे