Mysql unde

Da, sunt conștient de ceea ce "mulți la mulți" ..

Uneori trebuie să vă ocupați de situațiile în care datele sunt stocate într-un tabel într-o formă "incomodă" pentru muncă - ID-shniki sunt într-un câmp separat printr-o virgulă. Cum și de ce - nu voi intra în detalii. Cred că cei care se confruntă cu o astfel de situație nu vor avea întrebări. Cum cele mai bune pentru a „extinde“ acest design într-o foaie de calcul familiară, multe-la-multe, pentru a lucra cu tabele aferente a fost mai ușor (și mai rapid - deoarece căutarea subșir este mult mai lent decât indicele).







În orice caz, trebuie să dezasamblat coloana cu valorile separate prin virgule. cu toate acestea, este mai bine și mai corect să faceți acest lucru o dată, decât cu fiecare cerere. Luați în considerare, de exemplu, lucrul cu domeniul unde IN_1 (`field`)

Situația este după cum urmează. există, de exemplu, un tabel

CREATE TABLE Dacă nu există "prefix_ids" (
`id` bigint (20) NU NULL,
"idards" varchar (255) NU NULL,
TASTĂ PRIMARĂ (`id`))

În care id-ul este un întreg, cheia primară. și ID-uri - "asociate id-shniki prin virgulă .." adică. de exemplu, datele pot arăta.

INSERTAȚI IGNORE ÎN VALORILE `prefix_ids`
(1, 2, 3 '),
(2, 3,4 '),
(3, 1 '),
(4, 1, 2, 3 '),

Sarcina este de a obține aceeași masă "de la mulți la mulți" (aceasta este o tabelă separată ca produs-produs sau categorie de produs)

CREATE TABLE Dacă nu există "prefix_id_id" (
`id1` bigint (20) NU NULL,






`id2` bigint (20) NU NULL,
TASTĂ PRIMARĂ (`id1`,` id2`))

Se pare. situația este simplă. cereți cu WHERE id în (1,2,3)

INSERTAȚI ÎN `prefix_id_id` (id1, id2) SELECT p1.id, p2.id
FROM prefix_ids p1 INNER JOIN prefix_id p2 ON p2.id IN (p1.ids)

Interogarea rulează destul de repede, dar numărul de rânduri este mult mai mic decât se aștepta.
Faptul este că există o reducere a tipurilor. și anume în expresia IN ('LINE'), se folosește valoarea numerică a șirului. - la prima virgulă.

Alternativ, utilizați LIKE '% 5%'. și anume întreaga interogare va arăta
INSERTAȚI ÎN `prefix_id_id` (id1, id2) SELECT p1.id, p2.id
DE LA prefix_ids p1 INTERIOARĂ ÎNSCRIEȚI prefix_ids p2 PE p1.ids LIKE CONCAT ( '%', p2.id, '%')

Firește. nu se poate pune problema nici unui indiciu în această situație. Dar. că astfel. există situații când există linii "superficiale". De exemplu, pentru numerele de două cifre ... (3, '1,21') LIKE '% 2%' va funcționa.

Id-urile pot fi suplimentate cu o virgulă de la stânga la dreapta și este folosit ca un limitator pentru a găsi (utiliza mai bine „separat“. Adică primele ID-uri supliment cu virgule, și apoi efectuați un „complex“ de interogare)
INSERTAȚI ÎN `prefix_id_id` (id1, id2) SELECT p1.id, p2.id
DIN prefix_ids p1 INTERIOARĂ ÎNSCRIEȚI prefix_ids p2 PE CONCAT ( '' p1.ids, ' ') LIKE CONCAT ( '%', p2.id,' %');

O altă opțiune este utilizarea funcției FIND_IN_SET (str, strlist), care returnează numărul elementului din listă (separat printr-o virgulă)

Cu toate acestea, opțiunea cea mai optimă, rapid și versatil încă a fost cel mai evident, dar „în cele două cereri“ și în afara bazei (opțiunea cu crearea unei proceduri stocate nu a fost considerat, deoarece într-un număr de hosting există o limitare cu privire la utilizarea procedurilor stocate).

Prima interogare obține toate elementele necesare procesării din tabel. pentru fiecare dintre acestea, în cazul în care este necesar prepararea unei matrice de elemente adiacente și formează un șir de forma $ interogare = (1,2), (1,3), ..., la sfârșitul ciclului, care se introduce în tabelul nostru una (sau mai multe., cu 1000 de elemente, de exemplu, dacă șirul este suficient de lung)

INSCRIEȚI ÎN "prefix_id_id" VALUES $ query







Articole similare

Trimiteți-le prietenilor: