मैं अपने नीचे शामिल क्वेरी में कुछ समूह द्वारा एकत्रीकरण समस्या का सामना कर रहा हूं:
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 का उपयोग करके सभी चैट को समूहबद्ध करने के लिए समूह का उपयोग कर रहा हूं। मैं दिनांक समय के साथ केवल अंतिम चैट संदेश प्रदर्शित कर रहा हूं।
संक्षेप में यह व्हाट्सएप चैट लिस्ट (पहली होम स्क्रीन) या फेसबुक मैसेंजर चैट लिस्ट की तरह ही है। जो अपने अंतिम चैट संदेश के साथ उपयोगकर्ता विवरण प्रदर्शित करते हैं।
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
चूंकि आपकी क्वेरी को एकल उपयोगकर्ता (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
मुझे लगता है कि आप इसके लिए विंडो फ़ंक्शंस का उपयोग करना चाहते हैं:
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;
संबंधित सवाल
नए सवाल
mysql
MySQL एक फ्री, ओपन सोर्स रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है जो स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) का उपयोग करता है। इस टैग को अन्य DBs जैसे SQL Server, SQLite आदि के लिए उपयोग न करें। वे विभिन्न DB हैं जो सभी डेटा का प्रबंधन करने के लिए SQL की अपनी बोलियों का उपयोग करते हैं।