Ini menggunakan konsep cross join
alias Produk Cartesian (semua permutasi). Jadi array Anda menghasilkan tabel turunan (dalam memori) dengan jumlah baris x*y*z
, di mana x,y,z itu adalah ukuran array. Jika Anda menyediakan larik berukuran 3,4, dan 5, tabel turunan akan memiliki jumlah baris 3*4*5=60.
Pencocokan larik yang Anda berikan yang menghasilkan baris hanya 4*1*1=4
thing7
di bawah ini adalah tabel utama yang Anda cari. covering index
harus membuat hal ini terbang bahkan dengan banyak data di dalamnya. Indeks penutup adalah indeks di mana informasi yang diberikan diberikan melalui pemindaian b-tree indeks, dan pembacaan halaman data tidak diperlukan. Mengapa? Karena data yang dibutuhkan ada di index. Dan dalam kasus Anda, sangat tipis.
Tabel A B C digunakan sebagai array Anda.
Satu-satunya hal lain untuk dikatakan adalah bahwa setiap tabel turunan memerlukan nama. Jadi kami memberinya nama xDerived
dalam kueri. Pikirkan tabel turunan sebagai sesuatu yang dikembalikan dan digunakan dalam memori. Ini bukan tabel fisik.
Skema
create table thing7
( id int auto_increment primary key,
A int not null,
B int not null,
C int not null,
index(A,B,C) -- covering index (uber-thin, uber-fast)
);
insert thing7(A,B,C) values
(1,2,7),
(1,2,8),
(2,2,1),
(1,3,1);
create table A
( id int auto_increment primary key,
value int
);
create table B
( id int auto_increment primary key,
value int
);
create table C
( id int auto_increment primary key,
value int
);
Uji 1
truncate table A;
truncate table B;
truncate table C;
insert A (value) values (1),(2),(3),(4);
insert B (value) values (2);
insert C (value) values (7);
select t7.*
from thing7 t7
join
( select A.value as Avalue, B.value as Bvalue, C.value as Cvalue
from A
cross join B
cross join C
order by a.value,b.value,c.value
) xDerived
on xDerived.Avalue=t7.A and xDerived.Bvalue=t7.B and xDerived.Cvalue=t7.C;
+----+---+---+---+
| id | A | B | C |
+----+---+---+---+
| 1 | 1 | 2 | 7 |
+----+---+---+---+
..
Uji 2
truncate table A;
truncate table B;
truncate table C;
insert A (value) values (1);
insert B (value) values (2);
insert C (value) values (0);
select t7.*
from thing7 t7
join
( select A.value as Avalue, B.value as Bvalue, C.value as Cvalue
from A
cross join B
cross join C
order by a.value,b.value,c.value
) xDerived
on xDerived.Avalue=t7.A and xDerived.Bvalue=t7.B and xDerived.Cvalue=t7.C;
-- no rows returned
Akan sangat mudah untuk mengubah ini menjadi pencarian berbasis sesi. Konsepnya ada satu di mana array yang akan dicari (tabel A B C) memiliki kolom sesi. Ini kemudian akan memfasilitasi penggunaan bersamaan multi-pengguna. Tapi itu adalah jawaban yang terlalu direkayasa, tetapi tanyakan apakah Anda ingin info lebih lanjut tentang itu.