जब डेटाबेस कॉलम के साथ-साथ चेक कंडीशन में कई मान हों तो मैं WHERE NOT IN कंडीशन कैसे कर सकता हूं।

मैं उपयोगकर्ता की स्थिति को 1 पर सेट करना चाहता हूं, यदि वह बहिष्कृत उपयोगकर्ता समूह से संबंधित नहीं है

उपयोगकर्ता स्थिति तालिका :- user_status

+---------+--------+
| user_id | status |
+=========+========+
| 1       | 1      |
+---------+--------+

उपयोगकर्ता तालिका: - उपयोगकर्ता

+---------+---------------+---------------------+
| user_id | user_group_id | secondary_group_ids |
+=========+===============+=====================+
| 1       | 4             | 2,8,9               |
+---------+---------------+---------------------+

चर:-

$excludeUsergroups = "8,7,12"
$finalExcludeUsergroups = implode(",", $excludeUsergroups);

मैं जिस प्रश्न का प्रदर्शन करना चाहता हूं वह है: -

Update user_status us 
    LEFT JOIN user u ON us.user = u.user 
    SET us.status = 1
    WHERE (u.user_group_id NOT IN (". $finalExcludeUsergroups . ") AND u.secondary_group_ids NOT IN (" . $finalExcludeUsergroups . "))

अब मुद्दा यह है कि, u.secondary_group_ids और $ finalExcludedUsergroups दोनों के कई मान हैं, यह उस सेकंड नॉट IN के चेक पर त्रुटि दे रहा है।

यह user_group_id के लिए जांच करता है क्योंकि इसमें केवल 1 मान होता है, लेकिन जब यह second_groups_ids पर जाता है तो यह विफल हो जाता है

मैं दूसरा नॉट इन कैसे कर सकता हूं जहां यह माध्यमिक_ग्रुप_आईड्स के प्रत्येक मान की जांच करता है और इसे $ finalExcludedUsergroups के साथ जांचता है

अपडेट करें मैंने FIND_IN_SET के साथ परीक्षण किया, हालांकि यह काम नहीं करता है, क्योंकि FIND_IN_SET स्ट्रिंग्स की सूची से एक स्ट्रिंग की जांच करता है FIND_IN_SET(string, string_list)

लेकिन मेरे मामले में मैं स्ट्रिंग्स की सूची से स्ट्रिंग्स की एक सूची देखना चाहता हूं, जो FIND_IN_LIST के साथ संभव नहीं है।

0
Vivek Bora 9 सितंबर 2020, 23:31

3 जवाब

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

ठीक है, इसलिए मैंने फ़ोरैच लूप के माध्यम से जो करना चाहा वह हासिल किया, मैंने $ finalExcludeUsergroups के माध्यम से लूप किया और FIND_IN_SET की एक सरणी बनाई और इसे क्वेरी में शामिल करने के बजाय।


foreach ($excludeUsergroups as $usergroup)
        {
            $statusJoiner[] = 'FIND_IN_SET(' . $db->quote($usergroup) .' , user.secondary_group_ids) = 0';
        }

और मैं उनसे AND कंडीशन के माध्यम से जुड़ गया

if (!empty($statusJoiner))
        {
            //Joiner for hit part
            $Joiner = ' AND ';
            $statusFinalJoiner = implode($Joiner,$statusJoiner);
        }

और क्वेरी से इस तरह जाता है: -

Update user_status us 
    LEFT JOIN user u ON us.user = u.user 
    SET us.status = 1
    WHERE (u.user_group_id NOT IN (". $finalExcludeUsergroups . ") AND " . $statusFinalJoiner . ")

बस इतना ही, इसने काम किया :)

0
Vivek Bora 14 सितंबर 2020, 10:52

मैं आपके मुद्दे से चिंतित था और सोच रहा था कि क्या एक साधारण उपयोगकर्ता परिभाषित फ़ंक्शन मदद कर सकता है, इसलिए नीचे दिया गया उदाहरण तैयार करें। यदि आप अपने डीबी में फ़ंक्शन बनाते हैं, तो यह देखने के लिए कि क्या कोई समूह साझा किया गया है, आपको अपनी क्वेरी के अंदर अपने दो "अल्पविराम से अलग मूल्य" स्ट्रिंग पास करने में सक्षम होना चाहिए। जैसा कि आप देखेंगे, मैंने इसे नेगेटिव केस (यानी डिसजॉइंट) के लिए नाम दिया है क्योंकि मैं पॉजिटिव केस (यानी Sets_have_one_or_more_elements_in_common थोड़ा लंबा लगता है!)

उम्मीद है कि किसी को यह किसी बिंदु पर उपयोगी लग सकता है!

/*
    MySQL Function to determine whether two comma-separated strings
    supplied as parameters share any common elements.
    
    Example Usage: 
    SELECT SETS_ARE_DISJOINT('8,7,12', '2,8,9'); --> False - shared entry = 8
    SELECT SETS_ARE_DISJOINT('7,12', '2,8,9');   --> True  - no shared entries
    
*/
CREATE FUNCTION SETS_ARE_DISJOINT(csv1 TEXT, csv2 TEXT)
  RETURNS BOOLEAN
  LANGUAGE SQL
BEGIN
    DECLARE Occurrences INT;
    DECLARE myValue TEXT;
    SET Occurrences = LENGTH(TRIM(csv1)) - LENGTH(REPLACE(TRIM(csv1), ',', ''));
Loop1:
    WHILE Occurrences > 0 DO
        SET myValue = SUBSTRING_INDEX(csv1, ',', 1);
        IF (myValue != '') THEN
            IF FIND_IN_SET(myValue , csv2) > 0 THEN
               RETURN FALSE;
            END IF;
        ELSE
            LEAVE Loop1; 
        END IF;
        SET Occurrences = LENGTH(TRIM(csv1)) - LENGTH(REPLACE(TRIM(csv1), ',', ''));
        IF (Occurrences = 0) THEN 
            LEAVE Loop1; 
        END IF;
        SET csv1 = SUBSTRING(csv1, LENGTH(SUBSTRING_INDEX(csv1, ',', 1)) + 2);
    END WHILE;
    RETURN TRUE;
END;
0
user9601310 10 सितंबर 2020, 15:22