MySQL में कहाँ ()


84

मेरी क्वेरी है:

SELECT * FROM table WHERE id IN (1,2,3,4);

मैं इसका उपयोग उपयोगकर्ता समूह के लिए करता हूं और एक उपयोगकर्ता एक से अधिक समूहों में हो सकता है। लेकिन ऐसा लगता है कि जब किसी रिकॉर्ड में 1 और 3 जैसी कई आईडी होती हैं, तो mySQL उस पंक्ति को वापस नहीं करता है।

क्या उस पंक्ति को पाने का कोई तरीका भी है?


7
कृपया उन पंक्तियों का उदाहरण पोस्ट करें जो इस क्वेरी से ठीक से नहीं लौटती हैं। यह मानते हुए कि आप idअल्पविराम से अलग की गई सूची या कुछ और के रूप में संग्रहीत नहीं कर रहे हैं , कई पंक्तियाँ आपके प्रश्न से वापस आ जाएंगी
माइकल बर्कोव्स्की

1
अच्छी तरह से यह एक अल्पविराम से अलग की गई सूची है, उदाहरण के लिए = 3,4 mySQL द्वारा वापस नहीं किया जाएगा। मुझे समस्या दिखाई देती है, यह अल्पविराम के बारे में है लेकिन मैं इसे कैसे कर सकता था?
नेटकेस

1
@ user762683, कृपया एक उचित प्रोफ़ाइल नाम का उपयोग करें? और इसके id, वारचर या सेट या एनम का डेटा प्रकार क्या है ?
Starx

1
@Starx आपके द्वारा किसी के द्वारा उपयोग किए जाने वाले प्रोफ़ाइल नाम का कौन सा व्यवसाय है?
माइकल बर्कोव्स्की

1
@ मिचेल, देखें ओपी के अनुरूप करने के लिए ध्वनियां कितनी आसान और सही netcaseहैं @user762683?
Starx

जवाबों:


82

आपकी क्वेरी का अनुवाद

SELECT * FROM table WHERE id='1' or id='2' or id='3' or id='4';

यह केवल उसके मिलान वाले परिणामों को लौटाएगा।


जटिलता से बचने के लिए इसे हल करने का एक तरीका होगा, डेटाटाइप का जप करना SET। तब आप उपयोग कर सकते हैं, FIND_IN_SET

SELECT * FROM table WHERE FIND_IN_SET('1', id);

किसी भी त्रुटि को पुन: उत्पन्न नहीं कर सकता। मेरे लिए अनुरोधित क्वेरी काम करती है। मुझे सूचीबद्ध आईडी के साथ 'तालिका' से सभी रिकॉर्ड मिलते हैं।
BF

39

आपके पास गलत डेटाबेस डिज़ाइन है और आपको डेटाबेस सामान्यीकरण ( विकिपीडिया / स्टैकओवरफ़्लो ) के बारे में कुछ पढ़ने के लिए समय लेना चाहिए ।

मुझे लगता है कि आपकी तालिका कुछ इस तरह दिखती है

TABLE
================================
| group_id | user_ids | name   |
--------------------------------
| 1        | 1,4,6    | group1 |
--------------------------------
| 2        | 4,5,1    | group2 |    

इसलिए उपयोगकर्ता समूहों की आपकी तालिका में, प्रत्येक पंक्ति एक समूह का प्रतिनिधित्व करती है और user_idsस्तंभ में आपके पास उस समूह को निर्दिष्ट उपयोगकर्ता आईडी का सेट होता है।

इस तालिका का सामान्यीकृत संस्करण इस तरह दिखेगा

GROUP
=====================
| id       | name   |
---------------------
| 1        | group1 |
---------------------
| 2        | group2 |    

GROUP_USER_ASSIGNMENT
======================
| group_id | user_id |
----------------------
| 1        | 1       |
----------------------
| 1        | 4       |
----------------------
| 1        | 6       |
----------------------
| 2        | 4       |
----------------------
| ...      

तब आप आसानी से असाइन किए गए समूह के साथ सभी उपयोगकर्ताओं, या समूह के सभी उपयोगकर्ताओं, या उपयोगकर्ता के सभी समूहों या आप जो भी सोच सकते हैं, का चयन कर सकते हैं। इसके अलावा, आपकी sql क्वेरी काम करेगी:

/* Your query to select assignments */
SELECT * FROM `group_user_assignment` WHERE user_id IN (1,2,3,4);

/* Select only some users */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE user_id IN (1,4);

/* Select all groups of user */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`user_id` = 1;

/* Select all users of group */
SELECT * FROM `group_user_assignment` t1
JOIN `group` t2 ON t2.id = t1.group_id
WHERE t1.`group_id` = 1;

/* Count number of groups user is in */
SELECT COUNT(*) AS `groups_count` FROM `group_user_assignment` WHERE `user_id` = 1;

/* Count number of users in group */
SELECT COUNT(*) AS `users_count` FROM `group_user_assignment` WHERE `group_id` = 1;

इस तरह से डेटाबेस अपडेट करना भी आसान हो जाएगा, जब आप नया असाइनमेंट जोड़ना चाहेंगे, तो आप बस नई पंक्ति डालें group_user_assignment, जब आप असाइनमेंट निकालना चाहते हैं तो आप केवल पंक्ति हटाएं group_user_assignment

अपने डेटाबेस डिज़ाइन में, असाइनमेंट अपडेट करने के लिए, आपको अपना असाइनमेंट डेटाबेस से सेट करना होगा, इसे प्रोसेस करना होगा और अपडेट करना होगा और फिर डेटाबेस में वापस लिखना होगा।

यहाँ sqlFiddle के साथ खेलने के लिए है।


1

आपके पास डेटाबेस में तालिका या सरणी रिकॉर्ड होना चाहिए।

उदाहरण:

SELECT * FROM tabel_record
WHERE table_record.fieldName IN (SELECT fieldName FROM table_reference);

एक subselect की आवश्यकता नहीं है। IN (1,2,3,4)पूरी तरह से वैध है। इसके अलावा, मुझे यह समझ में नहीं आता कि यह कैसे "जब एक रिकॉर्ड में 1 और 3 की तरह कई आईडी होती हैं, तो प्रश्न में mySQL उस पंक्ति को वापस नहीं करता है"।
स्कॉरटे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.