মাইএসকিউএল ব্যবহার করে তিনটি টেবিল যোগ দিচ্ছেন


117

আমার তিনটি টেবিল রয়েছে

**Student Table**
-------------
id    name
-------------
1     ali
2     ahmed
3     john
4     king

**Course Table**
-------------
id    name
-------------
1     physic
2     maths
3     computer
4     chemistry

**Bridge**
-------------
sid    cid
-------------
1     1
1     2
1     3
1     4
2     1
2     2
3     3
3     4
4     1
4     2

এখন কোর্সের নামের সাথে শিক্ষার্থীর নাম দেখাতে যা তিনি পড়াশুনা করেছিলেন,

**Result**
---------------------------
Student        Course
---------------------------
ahmed         physic
ahmed         maths
ahmed         computer
ahmed         chemistry
ali           physic
ali           maths
john          computer
john          chemistry
king          physic
king          maths

আমি নিম্নলিখিত কোয়েরি নির্মাণ

select s.name as Student, c.name as Course from student s, course c join bridge b on c.id = b.cid order by s.name

তবে এটি প্রয়োজনীয় ফলাফল দেয় না ...

এবং নর্মালাইজড ফর্মের জন্য কী হবে, যদি আমি জানতে চাই যে কে অন্যের উপরে পরিচালক আছেন:

**employee**
-------------------
id        name
-------------------
1         ali
2         king
3         mak
4         sam
5         jon

**manage**
--------------
mid      eid
--------------
1         2
1         3
3         4
4         5

এবং এই ফলাফল পেতে চায়:

**result**
--------------------
Manager      Staff
--------------------
ali          king
ali          mak
mak          sam
sam          jon

প্রথম
ফলাফলটিতে

উত্তর:


150

সহজভাবে ব্যবহার করুন:

select s.name "Student", c.name "Course"
from student s, bridge b, course c
where b.sid = s.sid and b.cid = c.cid 


1
সুন্দর এবং সহজ, কিন্তু FWIW বিবেচনা এই সিনট্যাক্স পুনরায় নিম্নলিখিত ব্লগ: sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins যেমন উল্লেখ stackoverflow.com/a/13476050/ 199364
ToolmakerSteve

199

এএনএসআই সিনট্যাক্স ব্যবহার করুন এবং আপনি কীভাবে টেবিলগুলিতে যোগ দিচ্ছেন তা অনেক বেশি স্পষ্ট হবে:

SELECT s.name as Student, c.name as Course 
FROM student s
    INNER JOIN bridge b ON s.id = b.sid
    INNER JOIN course c ON b.cid  = c.id 
ORDER BY s.name 

9
@ মুহম্মদ: আমাদের উত্তরগুলি একই, তারা কেবল বাক্য গঠনে পৃথক। আপনি যদি ANSIসিনট্যাক্স সম্পর্কে সচেতন না হন তবে এটি শেখার জন্য আপনার সময়টি উপযুক্ত। এটি আপনাকে JOINভবিষ্যতের মতো ত্রুটিগুলি এড়াতে সহায়তা করবে ।
রেডফিল্টার

16

ফর্মটি স্বাভাবিক করার জন্য

select e1.name as 'Manager', e2.name as 'Staff'
from employee e1 
left join manage m on m.mid = e1.id
left join employee e2 on m.eid = e2.id

অনুক্রমে কোন ব্যাপার m.mid = e1.idএবং m.eid = e2.id?
প্যাথ্রোস

1
@ প্যাট্রোস নো, আদেশটি সেই মত নয়।
টুলমেকারস্টেভ

4
SELECT *
FROM user u
JOIN user_clockits uc ON u.user_id=uc.user_id
JOIN clockits cl ON cl.clockits_id=uc.clockits_id
WHERE user_id = 158

এই উত্তরটি 5 বছর আগে ইতিমধ্যে দেওয়া উত্তরের সাথে খুব মিল দেখাচ্ছে। আপনার উত্তরটি কী গুরুত্বপূর্ণ বলে মনে করছেন এবং বিদ্যমান উত্তরগুলি অনুপস্থিত?
স্টেভ

1
SELECT 
employees.id, 
CONCAT(employees.f_name," ",employees.l_name) AS   'Full Name', genders.gender_name AS 'Sex', 
depts.dept_name AS 'Team Name', 
pay_grades.pay_grade_name AS 'Band', 
designations.designation_name AS 'Role' 
FROM employees 
LEFT JOIN genders ON employees.gender_id = genders.id 
LEFT JOIN depts ON employees.dept_id = depts.id 
LEFT JOIN pay_grades ON employees.pay_grade_id = pay_grades.id 
LEFT JOIN designations ON employees.designation_id = designations.id 
ORDER BY employees.id;

আপনি উপরের উদাহরণটির মতো একাধিক টেবিলগুলিতে যোগদান করতে পারেন।


বহু বছর আগে থেকে ইতিমধ্যে একাধিক উত্তর রয়েছে যা "একাধিক টেবিলগুলিতে যোগদান" দেখায়। আপনার উত্তর আলোচনায় কী যুক্ত করে?
টুলমেকারস্টেভ

0

দুটিরও বেশি টেবিলগুলিতে যোগদানের জন্য প্রশ্ন:

SELECT ops.field_id, ops.option_id, ops.label
FROM engine4_user_fields_maps AS map 
JOIN engine4_user_fields_meta AS meta ON map.`child_id` = meta.field_id
JOIN engine4_user_fields_options AS ops ON map.child_id = ops.field_id 
WHERE map.option_id =39 AND meta.type LIKE 'outcomeresult' LIMIT 0 , 30

বহু বছর আগে থেকে ইতিমধ্যে একাধিক উত্তর রয়েছে যা "একাধিক টেবিলগুলিতে যোগদান" দেখায়। আপনার উত্তর আলোচনায় কী যুক্ত করে?
টুলমেকারস্টেভ

0

এটা ব্যবহার কর:

SELECT s.name AS Student, c.name AS Course 
FROM student s 
  LEFT JOIN (bridge b CROSS JOIN course c) 
    ON (s.id = b.sid AND b.cid = c.id);

1
এই উত্তরটি এই প্রশ্নের ক্ষেত্রে নতুন কিছু যুক্ত করে না এবং অদ্ভুত ব্যবহার করে (যদি ভুল ভুল বাক্য গঠন না হয় তবে আমি মাইএসকিউএলে এটি বৈধ হলেও অবাক হব)।
অ্যারোএক্স

আমি অ্যারোএক্সের সাথে একমত নই। আনসি জোড় সিনট্যাক্স বলতে পুরানো স্কুল কমা / যেখানে সিনট্যাক্সে যোগদান নিয়ে সমস্যাগুলি নিবারণ করা। আমি মাইএসকিউএল বিশেষভাবে আনসি জোড় সিনট্যাক্স সমর্থন করে কিনা তা দেখতে খুঁজছি।
ল্যারি স্মিথ

0

এর মতো যোগদান করবেন না। এটি সত্যিই একটি খারাপ অভ্যাস !!! এটি প্রচুর ডেটা সাথে আনতে পারফরম্যান্সকে ধীর করবে। উদাহরণস্বরূপ, প্রতিটি টেবিলে 100 টি সারি থাকলে ডাটাবেস সার্ভারে 100x100x100 = 1000000সময় আনতে হবে । এটি বেশ 1 millionকয়েকবার আনতে হয়েছিল । এই সমস্যাটি কাটিয়ে উঠতে, প্রথম দুটি টেবিলটিতে যোগ দিন যা সর্বনিম্ন সম্ভাব্য মিলের ফলাফল পেতে পারে (এটি আপনার ডাটাবেসের স্কিমা অবধি)। সাবকিউরিতে ফলাফলটি ব্যবহার করুন এবং তারপরে এটি তৃতীয় টেবিলের সাথে যুক্ত হয়ে এটি আনুন। প্রথমবার যোগদানের জন্য -> 100x100= 10000বার এবং ধরুন আমরা 5 টি মিলে ফলাফল পেয়েছি। এবং তারপরে আমরা ফলাফলটির সাথে তৃতীয় সারণিতে যোগদান করি -> 5x100 = 500.মোট আনতে = 10000+500 = 10200বার কেবল। এবং এইভাবে, পারফরম্যান্স উঠে গেল !!!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.