Mysql এ ধারা দ্বারা ইউনিয়ন এবং শৃঙ্খলা ব্যবহার করা


123

আমি মাইএসকিএল কোয়েরিতে ইউনিয়নের সাথে ক্রমটি ব্যবহার করতে চাই। আমি আমার সাইটে অনুসন্ধানের জন্য দূরত্বের ভিত্তিতে একটি টেবিল থেকে বিভিন্ন মানদণ্ডের ভিত্তিতে বিভিন্ন ধরণের রেকর্ড আনছি। প্রথম নির্বাচিত ক্যোয়ারী সঠিক স্থান অনুসন্ধানের সাথে সম্পর্কিত ডেটা ফেরত দেয়। ২ য় নির্বাচিত ক্যোয়ারী অনুসন্ধান করা স্থান থেকে 5 কিলোমিটারের মধ্যে দূরত্ব সম্পর্কিত ডেটা ফেরত দেয়। তৃতীয় নির্বাচন জিজ্ঞাসাটি অনুসন্ধান করা স্থান থেকে 5-15 কিলোমিটারের মধ্যে দূরত্ব সম্পর্কিত ডেটা ফেরত দেয়।

তারপরে আমি ইউনিয়ন ব্যবহার করে সমস্ত ফলাফল মার্জ করে এবং পেজিংয়ের সাথে একটি পৃষ্ঠায় দেখায়। 'নির্ভুল অনুসন্ধান ফলাফল' , '5 কিমি এর মধ্যে ফলাফল' ইত্যাদি হিসাবে উপযুক্ত শিরোনামের অধীনে

এখন আমি আইডি বা অ্যাড_ডেটের ভিত্তিতে ফলাফলগুলি বাছাই করতে চাই। তবে যখন আমি আমার ক্যোয়ারির শেষে ক্লোজ অনুসারে অর্ডার যুক্ত করি (ক্যোয়ারী 1 ইউনিয়ন কোয়েরি 2 ইউনিয়ন কোয়েরি 3 অর্ডার_ডেট দ্বারা আদেশ)। এটি সমস্ত ফলাফল বাছাই করে। তবে আমি যা চাই তা প্রতিটি শিরোনামের অধীনে বাছাই করা উচিত।


প্রতিটি সারণিতে আপনি যে ক্ষেত্রগুলি বাছাই করতে চান সেগুলি কি / এর?
ব্যবহারকারী 151841

উত্তর:


221

আপনি প্রতিটি সিলেক্ট সিউডো-কলাম যুক্ত র‌্যাঙ্ক যুক্ত করে এটি করতে পারেন, যা আপনি প্রথমে বাছাই করতে পারেন, আপনার অন্যান্য মানদণ্ড অনুসারে বাছাই করার আগে, যেমন:

select *
from (
    select 1 as Rank, id, add_date from Table 
    union all
    select 2 as Rank, id, add_date from Table where distance < 5
    union all
    select 3 as Rank, id, add_date from Table where distance between 5 and 15
) a
order by rank, id, add_date desc

9
কেন আছে aএবং শেষ?
উদয় হিওরালে

25
মাইএসকিউএল প্রয়োজনীয় যে উত্সযুক্ত টেবিলগুলির একটি উপাধি রয়েছে।
রেডফিল্টার

4
@ রেডফিল্টার, আমি এটি পুরোপুরি পাই না। "উত্পন্ন টেবিল হিসাবে সমস্ত নির্বাচন করুন" এর পুরো বিন্দুটি কী যখন আমরা কেবল সমস্ত 3 টেবিল নির্বাচন করতে পারি তারপরে একটি করতে পারি order by? ( "সম্পূর্ণ UNIONফলাফলকে বাছাই বা সীমাবদ্ধ করতে পৃথক SELECTবিবৃতিকে প্রথম বন্ধনীর আকার দিন এবং শেষটির পরে ORDER BYবা তার LIMITপরে রাখুন" )। আপনার কোডের সাথে i.stack.imgur.com/LpTMU.png এর
পেসারিয়ার

1
@ পেসারিয়ার যদি সেই সিনট্যাক্সটি মাইএসকিউএল এর সাথে কাজ করে তবে এর জন্য যান! আমার বাক্য গঠনটি আরও কিছুটা ক্রস প্ল্যাটফর্ম, আমি সাধারণত মাইএসকিউএল নিয়ে কাজ করি না। আমি প্রকৃতপক্ষে এটি পছন্দ করি, যদিও এটি আরও সাধারণীকরণের ক্ষেত্রে কাজ করে যেমন, উদাহরণস্বরূপ, যখন আপনি কেবল সর্বশেষ ইউনিয়ন ক্যোয়ারী থেকে প্রথম দশটি ম্যাচ চান তখন বিবেচনা করুন - আমি মনে করি যে আপনাকে যাইহোক আমার সিনট্যাক্সে ফিরে যেতে হবে।
রেডফিল্টার

1
@ পেসারিয়র, এও বিবেচনা করুন যে মানটি এই উপায়ে "শীর্ষস্থান নির্বাচন করুন" "পরিবর্তে" নির্বাচন আইডি, অ্যাড_ডেট "এবং আপনি যদি না দেখতে চান তবে ফলাফলের বাইরে" র‌্যাঙ্ক "স্ট্রিপ করতে দেয়।
দেব নুল

45

এটি করতে আপনি সাবকিউরিগুলি ব্যবহার করতে পারেন:

select * from (select values1 from table1 order by orderby1) as a
union all
select * from (select values2 from table2 order by orderby2) as b

1
টিএনএক্স, আলাদা অর্ডার দেওয়ার জন্য ভাল। অর্ডার ধারাটি যদি সাধারণ ছিল তবে আমরা আলাদা আলাদা ব্যবস্থা রাখতে পারি তবে আমরা ফলাফলগুলি পৃথক করতে চাই (আদেশ আলাদা করার পরিবর্তে): SELECT * FROM ( SELECT aaa AS Col, 1 AS Official FROM table1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ORDER BY Official, Col
অ্যালিক্স

18
এটি ভুল : স্বতন্ত্র বক্তব্যের জন্য ব্যবহারের ফলে সারির চূড়ান্তORDER BYSELECT
ফলটিতে যে ক্রমটি

আপনি ঠিক বলেছেন, গৃহীত উত্তরটিও সঠিক। আমি যখন এটি পরীক্ষা করেছি ঠিক তখনই এটি ভাল কাজ করার জন্য ঘটেছে।
রিকিথেফক্স

shmosel (এবং রিকিথেফক্স) - ইউনিয়ন সমস্তই সদৃশগুলি সরায় না এবং তাই আপনার পৃথক বাছাই করা বাছাইয়ের ধরণের পরিবর্তন করার কোনও কারণ নেই। এই কারণেই এটি অতীতে আপনার পক্ষে কাজ করেছিল এবং ভবিষ্যতে কেন এটি আপনার পক্ষে কাজ করবে। চূড়ান্ত ফলাফলের সাথে জড়িত অর্ডারটি ইউনিয়নের (DISTINCT) সারিগুলিকে দক্ষতার সাথে একত্র করার জন্য এক ধরণের বাছাইয়ের কারণে হয়েছে। বা আরও সুনির্দিষ্টভাবে, বাছাই কারণ এটি দক্ষতার সাথে সারিগুলি একত্রিত করে। সুতরাং আপনি আপনার সাবকিউরিগুলি সংরক্ষণের জন্য ইউনিয়নের উপর নির্ভর করতে পারেন।
জেরার্ড ওনিল

2
এটি পুরানো মাইএসকিউএল সংস্করণগুলির জন্য দুর্দান্ত কাজ করছিল, এখন এই পদ্ধতির কাজ হবে না । কারণ এসকিউএল স্ট্যান্ডার্ড সাবকিউয়ের অর্ডার সংরক্ষণের গ্যারান্টি দেয় না।
Andrei

28
(select add_date,col2 from table_name) 
  union 
(select add_date,col2 from table_name) 
  union 
(select add_date,col2 from table_name) 

order by add_date

এটি কাজ করেছিল, তবে অদ্ভুতভাবে আমার একটি জিনিস বদলাতে হবে: আমাকে যে ক্ষেত্রটি অর্ডার করছে তার একটি ভাগ করা ওরফে দিতে হবে। এর বাইরেও কাজ করেছেন, ধন্যবাদ!
হোল্ডঅফহাঙ্গার

9

ইউনিয়ন ক্যোয়ারিতে কেবলমাত্র একটি মাস্টার ORDER BYক্লজ থাকতে পারে, আইআইআরসি। এই পেতে, প্রতিটি বৃহত্তর অভাবপূরণ ক্যোয়ারীতে UNIONক্যোয়ারী, একটি ক্ষেত্র যে হতে হবে একটি ক্ষেত্র আপনি সাজানোর দ্বারা জুড়তে UNIONএর ORDER BY

উদাহরণস্বরূপ, আপনার মতো কিছু থাকতে পারে

SELECT field1, field2, '1' AS union_sort
UNION SELECT field1, field2, '2' AS union_sort
UNION SELECT field1, field2, '3' AS union_sort
ORDER BY union_sort

এই union_sortক্ষেত্রটি এমন কিছু হতে পারে যা আপনি বাছাই করতে পারেন। এই উদাহরণস্বরূপ, এটি কেবল প্রথম টেবিলের প্রথম, দ্বিতীয় সারণী দ্বিতীয়, ইত্যাদি থেকে ফলাফলগুলি সংঘটিত হতে পারে etc.


9

ভুলে যাবেন না, ইউনিয়ন সবই বাছাই বা মার্জ না করে রেকর্ড সেটগুলিতে রেকর্ড যুক্ত করার একটি উপায় (ইউনিয়নের বিপরীতে)।

উদাহরণস্বরূপ:

select * from (
    select col1, col2
    from table a
    <....>
    order by col3
    limit by 200
) a
union all
select * from (
    select cola, colb
    from table b
    <....>
    order by colb
    limit by 300
) b

এটি পৃথক প্রশ্নগুলি আরও পরিষ্কার রাখে এবং প্রতিটি ক্যোয়ারীতে আপনাকে বিভিন্ন পরামিতি অনুসারে বাছাই করতে দেয়। তবে নির্বাচিত উত্তরের উপায়টি ব্যবহার করে জটিলতার উপর নির্ভর করে এটি আরও স্পষ্ট হয়ে উঠতে পারে এবং ডেটা কতটা সম্পর্কিত সম্পর্কিত কারণ আপনি সাজানোর ধারণাটি তৈরি করছেন। এটি আপনাকে জিজ্ঞাসা প্রোগ্রামগুলিতে কৃত্রিম কলামটি ফেরত দেওয়ার অনুমতি দেয় যাতে এটির একটি প্রসঙ্গ থাকে যা এটি বাছাই বা সংগঠিত করতে পারে।

তবে এই উপায়টিতে দ্রুত হওয়া, অতিরিক্ত ভেরিয়েবলগুলি প্রবর্তন না করা এবং বাছাই সহ প্রতিটি ক্যোয়ারিকে আলাদা করা সহজ করার সুবিধা রয়েছে। সীমা যুক্ত করার ক্ষমতাটি কেবল একটি অতিরিক্ত বোনাস।

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


4

আমি এটি একটি জোড় প্লাস ইউনিয়নে কাজ করেছি।

(SELECT 
   table1.column1,
   table1.column2,
   foo1.column4
 FROM table1, table2, foo1, table5
 WHERE table5.somerecord = table1.column1
 ORDER BY table1.column1 ASC, table1.column2 DESC
)

UNION

(SELECT
    ... Another complex query as above
)

ORDER BY column1 DESC, column2 ASC

3

আপনি যখন ORDER BYকোনও UNIONএসএসকিএল এর সাথে মিলিতভাবে সাব-কোয়েরির অভ্যন্তরীণ একটি ক্লজ ব্যবহার করেন তখন এই ORDER BYধারাটি অপ্টিমাইজ করবে ।

এটি কারণ ডিফল্টরূপে একটি UNIONআনর্ডারড তালিকা ফিরিয়ে দেয় তাই কোনও ORDER BYকিছুই করবে না।

অপ্টিমাইজেশনের ডক্সে উল্লেখ করা হয়েছে এবং বলেছেন:

কোনও পৃথক নির্বাচনের মাধ্যমে অর্ডার বা লিমিট প্রয়োগ করতে, নির্বাচনটি বন্ধ করে দেওয়া বন্ধনীগুলির মধ্যে এই ধারাটি রাখুন:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

যাইহোক, পৃথক নির্বাচনী বিবৃতিগুলির জন্য অর্ডার বাই ব্যবহারের ফলে সারিগুলি চূড়ান্ত ফলাফলের ক্রম হিসাবে প্রদর্শিত হয় সে সম্পর্কে কিছুই বোঝায় না কারণ ইউনিয়ন ডিফল্টরূপে সারিগুলির একটি সীমানাবিহীন সেট তৈরি করে। সুতরাং, এই প্রসঙ্গে অর্ডার ব্যবহারের বিষয়টি সাধারণত সীমাবদ্ধতার সাথে একত্রে ব্যবহৃত হয়, যাতে এটি নির্বাচিত সারিগুলির উপসেট নির্ধারণ করতে ব্যবহৃত হয় নির্বাচিত জন্য পুনরুদ্ধার করার জন্য, যদিও এটি প্রয়োজনীয়ভাবে সেই সমস্ত সারিগুলির ক্রমকে প্রভাবিত করে না চূড়ান্ত ইউনিয়ন ফলাফল। যদি অর্ডার বাই কোনও সীমাতে লিমিট ছাড়াই উপস্থিত হয়, তবে এটি অপ্টিমাইজ করা হয়েছে কারণ এটি কোনওভাবেই প্রভাব ফেলবে না।

এর শেষ বাক্যটি কিছুটা বিভ্রান্তিকর কারণ এটির একটি প্রভাব থাকতে হবে। আপনি যখন সাব-কোয়ারির মধ্যে অর্ডার দেওয়ার দরকার এমন পরিস্থিতিতে থাকেন তখন এই অনুকূলকরণটি সমস্যার সৃষ্টি করে a

মাইএসকিউএলকে এই অপটিমাইজেশনটি না করার জন্য বাধ্য করার জন্য আপনি এর মতো একটি লিমিটেড ধারা যুক্ত করতে পারেন:

(SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
UNION ALL
(SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
UNION ALL
(SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)

একটি উচ্চ LIMITমানে হল আপনি OFFSETযদি পৃষ্ঠাগুলির মতো কিছু করতে চান তবে সামগ্রিক ক্যোয়ারিতে একটি যুক্ত করতে পারেন could

এটি আপনাকে ORDER BYপ্রতিটি ইউনিয়নের জন্য বিভিন্ন কলামে সক্ষম হওয়ার অতিরিক্ত সুবিধাও দেয় ।


0

চেষ্টা করুন:

SELECT result.* 
FROM (
 [QUERY 1]
 UNION
 [QUERY 2]
) result
ORDER BY result.id

[QUERY 1] এবং [QUERY 2] হ'ল এমন দুটি প্রশ্ন যা আপনি মার্জ করতে চান।


0

এর কারণ আপনি পুরো ফলাফল-সেটটিকে বাছাই করছেন, আপনার ইউনিয়নের প্রতিটি অংশ পৃথকভাবে বাছাই করা উচিত, অথবা আপনি অর্ডার বা ব্যবহার করতে পারেন (কিছু কিছু।


0

আমি অনুরোধের পূর্বে প্রতিটি প্রশ্নের সাথে অর্ডার যুক্ত করার চেষ্টা করেছি

(select * from table where distance=0 order by add_date) 
union 
(select * from table where distance>0 and distance<=5 order by add_date)

কিন্তু এটি কাজ করে বলে মনে হচ্ছে না। এটি প্রতিটি নির্বাচন থেকে সারিগুলির মধ্যে অর্ডারিংটি আসলে করে নি।

আমি মনে করি আপনাকে বাইরে থেকে অর্ডারটি রাখতে হবে এবং আদেশটির যেখানে ধারা রয়েছে সেখানে কলামগুলি যুক্ত করতে হবে, এরকম কিছু

(select * from table where distance=0) 
union 
(select * from table where distance>0 and distance<=5) 
order by distance, add_date

এটি কিছুটা জটিল হতে পারে, যেহেতু আপনি রেঞ্জগুলি অনুসারে গ্রুপ করতে চান তবে আমার মনে হয় এটি করণীয় হওয়া উচিত।


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