কীভাবে মাইএসকিএলে একটি ক্রম তৈরি করা যায়


19

এই টেবিলটি মাইএসকিএলে বিবেচনা করুন

create table numbers (number int);
insert into numbers values (3), (2), (9);
select * from numbers;

+--------+
| number |
+--------+
|      3 |
|      2 |
|      9 |
+--------+

নিম্নলিখিত কলামগুলির সাথে একটি সারণী উত্পন্ন করার জন্য কি সাধারণ জিজ্ঞাসা রয়েছে?

  1. 1 থেকে 10 পর্যন্ত সংখ্যা
  2. 1 যদি নম্বরটি টেবিলের সংখ্যাগুলিতে উপস্থিত থাকে এবং অন্যথায় 0 হয়

আমি অনুমান করি এটি করার জন্য আপনাকে সংখ্যার ক্রম তৈরি করতে হবে। যদি সম্ভব হয়, আমি এটি ডাটাবেসে সংরক্ষণ না করে এ জাতীয় ক্রম তৈরি করতে চাই।

সম্পর্কিত প্রশ্ন: একটি নির্বাচিত ক্যোয়ারী যা 1 থেকে 10 (বা 100 বা 1000) পর্যন্ত সংখ্যার ক্রম তৈরি করে?

উত্তর:


24

মারিয়াডিবিতে

মারিয়াডিবিতে একটি সিকিউইএসএস স্টোরেজ ইঞ্জিন রয়েছে । সুতরাং, আপনি যদি মারিয়াডিবি ব্যবহার করছেন তবে আপনার সমস্ত ক্রম সমস্যা শেষ হয়ে গেছে (বা সবে শুরু হয়েছে)।

10 সংখ্যার ক্রম

select * from seq_1_to_10;

টেবিল ব্যবহার করা হচ্ছে না

10 সংখ্যার ক্রম

select * from
(select 0 x union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) A;

100 সংখ্যা ক্রম

select (t*10+u+1) x from
(select 0 t union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) A,
(select 0 u union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) B
order by x;

1000 নম্বর ক্রম

select (h*100+t*10+u+1) x from
(select 0 h union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) A,
(select 0 t union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) B,
(select 0 u union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) C
order by x;

10000 সংখ্যার ক্রম

select (th*1000+h*100+t*10+u+1) x from
(select 0 th union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) A,
(select 0 h union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) B,
(select 0 t union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) C,
(select 0 u union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) D
order by x;

টেবিল ব্যবহার করা

10 সংখ্যার ক্রম

use test
drop table if exists seq10;
create table seq10
(x int not null auto_increment primary key);
insert into seq10 values (),(),(),(),(),(),(),(),(),();
select * from seq10;

100 সংখ্যা ক্রম

use test
drop table if exists seq100;
create table seq100
(x int not null auto_increment primary key);
insert into seq100 values (),(),(),(),(),(),(),(),(),();
insert into seq100 values (),(),(),(),(),(),(),(),(),();
insert into seq100 values (),(),(),(),(),(),(),(),(),();
insert into seq100 values (),(),(),(),(),(),(),(),(),();
insert into seq100 values (),(),(),(),(),(),(),(),(),();
insert into seq100 select x + 50 from seq100;
select * from seq100;

1000 নম্বর ক্রম

use test
drop table if exists seq1000;
create table seq1000
(x int not null auto_increment primary key);
insert into seq1000 values ();
set @p= -1;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
set @p=@p+1; insert into seq1000 select x+power(2,@p) from seq1000 where (x+power(2,@p)) <= 1000;
select * from seq1000;

যে কোনও সংখ্যার ক্রম (উদাহরণ: 3.5 মিলিয়ন)

use test
drop table if exists seq;
create table seq
(x int not null auto_increment primary key);
insert into seq values ();
set @maxseq = 3500000;
set @p = -1;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
set @p=@p+1; insert into seq select x+power(2,@p) from seq where (x+power(2,@p)) <= @maxseq;
select max(x),count(x) from seq;

আপনার বাস্তব প্রশ্ন

সিকোয়েন্সটি ব্যবহার করে 0..9, আপনি টেবিলের বিপরীতে ক্রমটিতে যোগ দিয়ে গেছেন left

select A.number,1-ISNULL(B.number) present from
(select 0 number union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) A
left join numbers B using (number);

নতুন প্রশ্নের সাথে আপনার নমুনা ডেটা data

mysql> drop table numbers;
Query OK, 0 rows affected (0.01 sec)

mysql> drop table if exists numbers;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table numbers (number int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into numbers values (3), (2), (9);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select A.number,1-ISNULL(B.number) present from
    -> (select 0 number union select 1 union select 2 union select 3 union select 4 union
    -> select 5 union select 6 union select 7 union select 8 union select 9) A
    -> left join numbers B using (number);
+--------+---------+
| number | present |
+--------+---------+
|      0 |       0 |
|      1 |       0 |
|      2 |       1 |
|      3 |       1 |
|      4 |       0 |
|      5 |       0 |
|      6 |       0 |
|      7 |       0 |
|      8 |       0 |
|      9 |       1 |
+--------+---------+
10 rows in set (0.00 sec)

mysql>

একবার চেষ্টা করে দেখো !!!


এখানে কোনও ফাংশন ব্যবহার করা কি খুব সহজ হবে না? একটি কাস্টম ফাংশন যা আপনারা যেমন উল্লেখ করেছেন ঠিক তেমন মারিয়াডিবি-র মতো একটি পরিসীমা প্রদান করেrange(10,20)
আজেফরাতি

2
@ রোল্যান্ডো - এটি এখনও কি সেরা উপায়? বন্ধুর জন্য জিজ্ঞাসা।
ম্যাক্স ভার্নন

1
মারিয়াডিবি এর বাইরে ম্যাক্স ভার্নন, এটি ফাংশন ব্যবহার না করেই আমি সিক্যুয়েন্সগুলি তৈরির পদ্ধতিতে বেশ কার্যকর। সারণী ব্যবহার না করে সিকোয়েন্সগুলি তৈরি করতে ডিস্ক I / O তৈরি করতে হবে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ ম্যাক্সভেরনন মাইএসকিউএল 8.0 এর নতুন প্রকাশিত জিএ সংস্করণ (এবং এক বছর আগে প্রকাশিত মারিয়াডিবি 10.2 জিএ সংস্করণ) সহ আপনি পুনরাবৃত্ত সিটিই ব্যবহার করতে পারেন যা এটিকে আরও সহজ করে তোলে। ভাল, মারিয়াডিবি সিকোয়েন্স স্টোরেজ ইঞ্জিনটি সবচেয়ে সহজ, তবে মাইএসকিউএল এবং মারিয়্যাডবি উভয় ক্ষেত্রেই কাজ করা দরকার এমন প্রশ্নের সাথে পুনরাবৃত্ত সিটিই হতে পারে।
dbdemon

5

মাইএসকিউএল 8.0, মারিয়াডিবি 10.2 এবং পরবর্তী সংস্করণগুলির সাহায্যে আপনি পুনরাবৃত্ত সিটিই ব্যবহার করতে পারেন, তাই:

WITH RECURSIVE nums AS (
    SELECT 1 AS value
    UNION ALL
    SELECT value + 1 AS value
    FROM nums
    WHERE nums.value <= 9
)
SELECT *
FROM nums;

আপনার পছন্দের প্রারম্ভিক মান, পদক্ষেপ এবং শেষের মানটি ব্যবহার করতে আপনি স্পষ্টতই এটি সংশোধন করতে পারেন।

দ্বিতীয় প্রশ্ন হিসাবে, এটি উপরেরটি প্রসারিত করার জন্য তুচ্ছ (রোনালদোর উত্তরের অংশ থেকে অনুপ্রেরণা দিয়ে):

WITH RECURSIVE nums AS (
    SELECT 1 AS value
    UNION ALL
    SELECT value + 1 AS value
    FROM nums
    WHERE nums.value <= 9
)
SELECT nums.value, 1-ISNULL(numbers.number) present
FROM nums
  LEFT JOIN numbers ON numbers.number = nums.value
ORDER BY nums.value;

সম্পাদনা:

মারিয়াডিবি 10.3 সিকোয়েন্স অবজেক্টস প্রবর্তন করেছে ( এসকিউএল স্ট্যান্ডার্ডে সংজ্ঞায়িত এবং যেমন যেমন ওরাকল আরডিবিএমএসে দেখা যায়)। এগুলি এই বিশেষ প্রশ্নের পক্ষে কার্যকর নয় যেহেতু মানগুলি ডাটাবেসে সংরক্ষণ করা থাকে তবে বৈশিষ্ট্যটি অন্যান্য ক্রম-সম্পর্কিত ব্যবহারের ক্ষেত্রে কার্যকর হতে পারে।

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