जब डेटाबेस कॉलम के साथ-साथ चेक कंडीशन में कई मान हों तो मैं 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 के साथ संभव नहीं है।
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 . ")
बस इतना ही, इसने काम किया :)
मैं MySql NOT REGEXP
Documentation< का उपयोग करूंगा/करूंगी /a> और रेगुलर एक्सप्रेशन /(^|\,)3($|\,)/
$sql = "UPDATE user_status us
LEFT JOIN user u ON us.user = u.user
SET us.status = 1
WHERE (u.user_group_id NOT REGEXP '(^|\,):id($|,)'
AND u.secondary_group_ids NOT REGEXP '(^|\,):id($|,)')";
अपने :id
पैरामीटर को $finalExcludeUsergroups
पर सेट करें, मैं उदाहरण दिखाऊंगा कि कैसे लेकिन यह नहीं पता कि आप mysqli, pdo, एक फ्रेमवर्क, आदि का उपयोग कर रहे हैं या नहीं
नियमित अभिव्यक्ति का टूटना:
- समूह
(^|\,)
स्ट्रिंग या अल्पविराम की शुरुआत से मेल खाएगा 3
उस आईडी से मेल खाएगा जिसे आप ढूंढ रहे हैं (कोड के लिए मैं यहां एक पैरामीटर का उपयोग करूंगा)- समूह
($|\,)
एक स्ट्रिंग या अल्पविराम के अंत से मेल खाएगा
मैं आपके मुद्दे से चिंतित था और सोच रहा था कि क्या एक साधारण उपयोगकर्ता परिभाषित फ़ंक्शन मदद कर सकता है, इसलिए नीचे दिया गया उदाहरण तैयार करें। यदि आप अपने डीबी में फ़ंक्शन बनाते हैं, तो यह देखने के लिए कि क्या कोई समूह साझा किया गया है, आपको अपनी क्वेरी के अंदर अपने दो "अल्पविराम से अलग मूल्य" स्ट्रिंग पास करने में सक्षम होना चाहिए। जैसा कि आप देखेंगे, मैंने इसे नेगेटिव केस (यानी डिसजॉइंट) के लिए नाम दिया है क्योंकि मैं पॉजिटिव केस (यानी 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;
संबंधित सवाल
नए सवाल
php
PHP एक व्यापक रूप से उपयोग किया जाता है, उच्च-स्तरीय, गतिशील, वस्तु-उन्मुख, और व्याख्या की गई स्क्रिप्टिंग भाषा मुख्य रूप से सर्वर-साइड वेब विकास के लिए डिज़ाइन की गई है। PHP भाषा के बारे में सवालों के लिए इस्तेमाल किया।