मैं अपने नीचे शामिल क्वेरी में कुछ समूह द्वारा एकत्रीकरण समस्या का सामना कर रहा हूं:

SELECT chat_tbl.chatrec_id,
       chat_tbl.senderid,
       chat_tbl.receiverid,
       chat_tbl.msg,
       chat_tbl.chat_time,
       chat_tbl.chatuser_strid, 
       chatuser_link_tbl.str_id, 
       chatuser_link_tbl.modifytime 
FROM chat_tbl 
INNER JOIN chatuser_link_tbl ON chat_tbl.chatuser_strid = chatuser_link_tbl.str_id 
                            AND (chat_tbl.senderid=393 OR chat_tbl.receiverid=393) 
GROUP by chat_tbl.chatuser_strid 
ORDER by chatuser_link_tbl.modifytime DESC

मुझे पता है कि मैं निम्नलिखित को क्रियान्वित करके only_full_group_by सेटिंग को अक्षम कर सकता हूं:

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

लेकिन यह गलत तरीका है, यह सेटिंग्स को छोड़ देगा और प्रत्येक सर्वर के पुनरारंभ होने के बाद इसे फिर से हटा दिया जाता है, इसलिए मैं अपनी क्वेरी को सही करना चाहता हूं। कृपया कोई भी 3 टेबल से इस जॉइन क्वेरी को सही ढंग से लिखने में मेरी मदद कर सकता है।

अग्रिम में धन्यवाद।

अपडेट 1: मैं इस क्वेरी का उपयोग वर्तमान उपयोगकर्ता द्वारा अन्य उपयोगकर्ताओं के साथ की गई सभी चैट को सूचीबद्ध करने के लिए कर रहा हूं।

मेरे पास यह करने के लिए 2 टेबल हैं कि chatuser_link_tbl में 2 उपयोगकर्ताओं के बीच की गई चैट का लिंक है, उदाहरण के लिए 11-18, 12-22 यानी डैश के साथ 2 उपयोगकर्ता आईडी - और चैट तालिका में एक वास्तविक चैट डेटा है।

मैं केवल एक अंतिम रिकॉर्ड प्राप्त करने के लिए chatuser_strid का उपयोग करके सभी चैट को समूहबद्ध करने के लिए समूह का उपयोग कर रहा हूं। मैं दिनांक समय के साथ केवल अंतिम चैट संदेश प्रदर्शित कर रहा हूं।

संक्षेप में यह व्हाट्सएप चैट लिस्ट (पहली होम स्क्रीन) या फेसबुक मैसेंजर चैट लिस्ट की तरह ही है। जो अपने अंतिम चैट संदेश के साथ उपयोगकर्ता विवरण प्रदर्शित करते हैं।

-1
Riya Parmar 31 अगस्त 2020, 09:00

3 जवाब

सबसे बढ़िया उत्तर

मैंने खुद इस मुद्दे को ठीक कर लिया है। वांछित परिणाम प्राप्त करने के लिए नीचे दी गई क्वेरी ने मेरे लिए काम किया।

ANY_VALUE ने मेरी सहायता की।

SELECT chat_tbl.chatuser_strid, ANY_VALUE(chat_tbl.chatrec_id),ANY_VALUE(chat_tbl.senderid),ANY_VALUE(chat_tbl.receiverid),ANY_VALUE(chat_tbl.msg),ANY_VALUE(chat_tbl.chat_time), ANY_VALUE(chatuser_link_tbl.str_id)       
FROM chat_tbl      
INNER JOIN chatuser_link_tbl      
ON chat_tbl.chatuser_strid = chatuser_link_tbl.str_id AND (chat_tbl.senderid=".$userid." OR chat_tbl.receiverid=".$userid.")       
GROUP by chat_tbl.chatuser_strid      
ORDER by ANY_VALUE(chatuser_link_tbl.modifytime) DESC
0
Riya Parmar 17 सितंबर 2020, 07:54

चूंकि आपकी क्वेरी को एकल उपयोगकर्ता (393 के बराबर प्रेषक या रिसीवर) पर काम करने के लिए डिज़ाइन किया गया है, आप बस समूह को छोड़ सकते हैं और एक सीमा जोड़ सकते हैं

SELECT chat_tbl.chatrec_id,
       chat_tbl.senderid,
       chat_tbl.receiverid,
       chat_tbl.msg,
       chat_tbl.chat_time,
       chat_tbl.chatuser_strid, 
       chatuser_link_tbl.str_id, 
       chatuser_link_tbl.modifytime 
FROM chat_tbl 
INNER JOIN chatuser_link_tbl ON chat_tbl.chatuser_strid = chatuser_link_tbl.str_id 
                            AND (chat_tbl.senderid=393 OR chat_tbl.receiverid=393) 
ORDER by chatuser_link_tbl.modifytime DESC
LIMIT 1 
0
Gabriel Durac 31 अगस्त 2020, 11:31

मुझे लगता है कि आप इसके लिए विंडो फ़ंक्शंस का उपयोग करना चाहते हैं:

SELECT *
FROM (SELECT c.*, cl.str_id, cl.modifytime,
             ROW_NUMBER() OVER (PARTITION BY c.chat_user_strid ORDER BY cul.modifytime DESC)
      FROM chat_tbl c JOIN
           chatuser_link_tbl cul
           ON c.chatuser_strid = cul.str_id AND
              393 IN (c.senderid, c.receiverid) 
     ) c
WHERE seqnum = 1;
0
Gordon Linoff 31 अगस्त 2020, 15:07