মাইএসকিউএল যেখানে ()


87

আমার জিজ্ঞাসাটি হ'ল:

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

আমি এটি ব্যবহারকারীর গোষ্ঠীর জন্য ব্যবহার করি এবং একজন ব্যবহারকারী একাধিক গ্রুপে থাকতে পারে। তবে মনে হয় রেকর্ডটিতে 1 এবং 3 এর মতো একাধিক আইডি থাকলে, মাইএসকিউএল সেই সারিটি ফেরায় না।

সেই সারিটি পাওয়ারও কি কোনও উপায় আছে?


7
এই সন্ধানটি যথাযথভাবে ফিরে আসে না এমন সারিগুলির একটি উদাহরণ পোস্ট করুন। ধরে নেওয়া যাক আপনি সংরক্ষণ করা হয় না idএকটি কমা দ্বারা পৃথক করা তালিকা বা কিছু হিসাবে, একাধিক সারি হবে আপনার প্রশ্নের থেকে ফিরে।
মাইকেল বার্কোভস্কি

4
ভাল এটি একটি কমা বিচ্ছিন্ন তালিকা, উদাহরণস্বরূপ => 3,4 মাইএসকিউএল দ্বারা ফিরে আসবে না। আমি সমস্যাটি দেখতে পাচ্ছি, এটি কমা সম্পর্কে তবে আমি এটি কীভাবে করব?
নেটকেস

4
@ user762683, দয়া করে একটি সঠিক প্রোফাইল নাম ব্যবহার করবেন? এবং এটি id, বারচার বা সেট বা এনামের ডেটা ধরণ কী?
স্টারেক্স

4
@ স্টারেক্স আপনার প্রোফাইলটি নাম ব্যবহার করে কেউ কী ব্যবহার করে?
মাইকেল বার্কোভস্কি

4
@ মিশেল, দেখুন ওপি এর netcaseপরিবর্তে শোনার জন্য শব্দগুলি কতটা সহজ এবং সঠিক @user762683?
স্টারেক্স

উত্তর:


85

আপনার প্রশ্নটি অনুবাদ করে

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);

কোনও ত্রুটি পুনরুত্পাদন করা যায় না। অনুরোধ করা ক্যোয়ারী আমার পক্ষে কাজ করে। আমি তালিকাভুক্ত আইডির সাথে 'টেবিল' থেকে সমস্ত রেকর্ড পাই।
বিএফ

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       |
----------------------
| ...      

তারপরে আপনি নির্ধারিত গোষ্ঠী সহ সমস্ত ব্যবহারকারী বা গোষ্ঠীর সমস্ত ব্যবহারকারী বা ব্যবহারকারীদের সমস্ত গোষ্ঠী বা আপনি যা ভাবতে পারেন তা সহজেই চয়ন করতে পারেন। এছাড়াও, আপনার বর্গ কোয়েরি কাজ করবে:

/* 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

আপনার ডাটাবেস ডিজাইনে, অ্যাসাইনমেন্ট আপডেট করার জন্য, আপনাকে ডাটাবেস থেকে আপনার অ্যাসাইনমেন্ট সেট করতে হবে, এটি প্রক্রিয়া করতে হবে এবং আপডেট করতে হবে এবং তারপরে আবার ডাটাবেসে লিখতে হবে।

এখানে sqlFizz সাথে খেলতে হয়।


2

আপনার অবশ্যই টেবিলে রেকর্ড বা ডাটাবেসে অ্যারে রেকর্ড থাকতে হবে।

উদাহরণ:

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

একটি সাবলেট প্রয়োজন হয় না। IN (1,2,3,4)পুরোপুরি বৈধ। এছাড়াও, আমি বুঝতে পারি না এটি কীভাবে ব্যাখ্যা করে "যখন একটি রেকর্ডে 1 এবং 3 এর মতো একাধিক আইডি থাকে, প্রশ্নে মাইএসকিউএল সেই সারিটি ফিরিয়ে দেয় না"।
স্ক্র্যাটে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.