Mysql hol

Igen, tudatában vagyok annak, hogy "Sokan sokakhoz".

Néha van, hogy a helyzetre, ha az adatok tárolása a táblázat „kényelmetlen” a forma - ID-Schnick hazugság egy területen, vesszővel elválasztva. Hogyan és miért - nem fogok részletekbe menni. Szerintem azok, akik ilyen helyzetben vannak, nem fognak kérdéseket feltenni. Hogyan lehet a legjobban „bontsa ki” A design egy ismerős táblázatkezelő, sok-sok, dolgozni kapcsolódó táblázatokban egyszerűbb (és gyorsabb -, mert azt a rész keresés sokkal lassabb, mint az index).

Mindenesetre az oszlopot vesszõvel elválasztva kell szétszerelni. azonban jobb és helyesebb ez egyszer, mint minden egyes kérésnél. Tekintsük például a munkát, ahol a field_1 IN (`field`)

A helyzet a következő. van például egy táblázat

CREATE TABLE, HA NEM EXISTS "prefix_ids" (
`id` bigint (20) NOT NULL,
`ids` varchar (255) NOT NULL,
PRIMARY KEY (`id`))

Ebben az idben egy egész szám, az elsődleges kulcs. és ids - "társított id-shniki vesszővel .." azaz. például az adatok lehetnek.

INSERT IGNORE INTO 'prefix_ids` VALUES
(1, '2,3'),
(2, '3,4'),
(3, '1'),
(4, '1,2,3'),

A feladat az, hogy ugyanazt a "sok-sok-sok" táblát kapja (ez egy külön táblázat, mint a termék-termék vagy a termékkategória)

CREATE TABLE, HA NEM VÁLLALJA "prefix_id_id" (
`id1` bigint (20) NOT NULL,
`id2` bigint (20) NOT NULL,
PRIMARY KEY ("id1", "id2"))

Úgy lenne. a helyzet egyszerű. kérelem WHERE azonosítóval (1,2,3)

INSERT INTO `prefix_id_id` (id1, id2) SELECT p1.id, p2.id
FROM prefix_ids p1 BELSŐ JOIN prefix_ids p2 BE p2.id IN (p1.ids)

A lekérdezés elég gyorsan fut, de a sorok száma a vártnál jóval alacsonyabb.
Az a tény, hogy csökken a típusok száma. azaz IN ('LINE') kifejezésben a karakterlánc számértékét használjuk. - az első vesszőhöz.

Alternatívaként használja a LIKE "% 5%" értéket. azaz a teljes lekérdezés fog kinézni
INSERT INTO `prefix_id_id` (id1, id2) SELECT p1.id, p2.id
FROM prefix_ids p1 BELSŐ JOIN prefix_ids p2 ON p1.ids LIKE CONCAT ('%', p2.id, '%')

Természetesen. ebben a helyzetben semmiféle mutató nem fordulhat elő. De. hogy ilyen. vannak olyan helyzetek, amikor "fölösleges" vonalak vannak. Például, kétjegyű számoknál ... (3, '1,21') LIKE '% 2%' fog működni.

Azonosítói ki lehet egészíteni egy vessző balról jobbra, és használják a határoló találni (használjon jobb „külön”. Azaz az első kiegészítő azonosítók vesszővel, majd hajtsa végre a „komplex” lekérdezés)
INSERT INTO `prefix_id_id` (id1, id2) SELECT p1.id, p2.id
AZ prefix_ids p1 inner join prefix_ids P2 CONCAT ( '' p1.ids, ' ') LIKE CONCAT ( '%', p2.id,' %');

Egy másik lehetőség a FIND_IN_SET (str, strlist) funkció használata, amely a listán szereplő elem számát (vesszővel elválasztva)

Azonban a legoptimálisabb, gyors és sokoldalú lehetőség is volt a legnyilvánvalóbb, de „a két kérés”, és ezen kívül az alap (opció létrehozását tárolt eljárás nem tekinthető, hiszen számos tárhely van egy korlátozás, tárolt eljárások).

Az első lekérdezés megkapja a feldolgozáshoz szükséges összes elemet a táblából. mindegyikük, ha szükséges előállítására egy sor szomszédos elemek és a forma egy sor formájában $ query = (1,2), (1,3), ... a végén a ciklus, amely helyezze a mi táblázatban egy (vagy több., 1000 elemek, például ha a karakterlánc elég hosszú)

INSERT INTO `prefix_id_id` VALUES $ lekérdezés

Kapcsolódó cikkek