Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL]Kopiowanie rekordów
Forum PHP.pl > Forum > Przedszkole
Skie
Witam,
a więc jak w temacie - Jak za pomocą jednego zapytania kopiować wiele rekordów o tym samym ID?

Mam w bazie tabelę o nazwie załóżmy 'test'
Mam także w PHP tablicę z numerami ID rekordów które mam skopiować do bazy

Próbowałem 2 sposoby:
  1. <?php
  2. "SELECT * INTO test FROM test WHERE ".$jstr;
  3. ?>


  1. <?php
  2. "INSERT INTO test SELECT * FROM test WHERE ".$jstr;
  3. ?>


Gdzie $jstr to string z ID rekordów do skopiowania, np "id=1 OR id=2 OR id=3"

Ponadto mam jeszcze drugie pytanie - jeżeli jakoś uda mi się skopiować te wartości dla id=1 OR id=2 OR id=3 to jak skopiować je dla np. id=1 OR id=2 OR id=1 (powtarza się id=1 a skrypt ma 2 razy go skopiować, NIE 1!)

Z góry dziękuję za odpowiedź ;-)
InosU31
nie wiem no ale skoro masz to w jakiejsc tablicy te dane i chcesz je wyslac do bazy to pewnie tak :

  1. <?php
  2. mysql_query("INSERT INTO test (id) VALUES ('$jstr') ");
  3. ?>


zakladam ze sam je wrzucasz do tej tablicy za pomoca jakiegos formularza np. tak??

a jesli chcesz miec to wszsytko w jednym rekordzie tzn. zeby ci sie zmienialo w jednym rekordzie to zrob tak :

  1. <?php
  2. mysql_query("UPDATE test SET id = '.$jstr.'");
  3. ?>



Cytat
Jak za pomocą jednego zapytania kopiować wiele rekordów o tym samym ID?


moze za pomoca jakiejs petli? bo ja wiem blinksmiley.gif
loko0
Może to rozwiązanie będzie pomocne:
http://www.sqlteam.com/article/using-selec...-insert-records

Oczywiście musisz poprawić na swoje potrzeby.
Skie
~ loko0: Nie do końca o to mi chodziło. Próbowałem już jeden ze sposobów opisanych w tym artykule.

~ InosU31: Źle mnie zrozumiałeś - $jstr nie zawiera żadnych danych tylko same ID rekordów które mają być skopiowane.

Na zasadzie, że mam np.:

$jstr = 'id=1 OR id=2 OR id=1';

I mam tabele 'test' w której każdy rekord składa się załóżmy z 30 komórek.
Załóżmy, że mam tylko taki rekordy w bazie:

id: 1, reszta danych
id: 2, reszta danych
id: 3, reszta danych

I po skopiowaniu (przy $jstr = 'id = 1 OR id=2 OR id=1) chciałbym by tak to wyglądało

id: 1, reszta danych
id: 2, reszta danych
id: 3, reszta danych
id: 4, takie same dane jak id=1
id: 5, takie same dane jak id=2
id: 6, takie same dane jak id=1

Ok, działa już (prawie)

  1. <?php
  2. "INSERT INTO test (pole1, pole2, pole3 ...) SELECT pole1, pole2, pole3 ... FROM test WHERE ".$jstr;
  3. ?>


Gdy zastąpiłem * na nazwy pól jak powyżej już przestało wywalać błąd.
Być może * nie działało, gdyż miałem komórkę o nazwie `desc` - nie skojarzyłem przy jej tworzeniu, że MySQL może to mylić z sortowaniem DESC, a teraz już za późno żeby zmieniać biggrin.gif
No ale nic, trudno, dodałem nawiasy do desc i działa (chociaż sama * powinno to zrobić automatycznie, ale co tam)

Tylko teraz mam ten błąd z OR
przy id=1 OR id=2 OR id=1 dodaje 2 rekordy, a powinien 3. Ma ktoś jakiś pomysł jak to poprawić?
loko0
Z * nie działa, ponieważ nie możesz 'skopiować' całych rekordów wraz z ID, które, domyślam się, jest kluczem podstawowym i nie może się powtarzać. Musisz wyszczególnić wszystkie pola oprócz id.
Cytat
Tylko teraz mam ten błąd z OR
przy id=1 OR id=2 OR id=1 dodaje 2 rekordy, a powinien 3. Ma ktoś jakiś pomysł jak to poprawić?

Dodaje dwa, ponieważ taki jest warunek id=1 or id=2 or id=1. Zwróci rekordy z id=1 i id=2. Musisz tak sprecyzować zapytanie, żeby zwracało trzy rekordy.
Skie
1. A nie ma krótszej drogi do zapisania tego niż (pole1, pole2, pole3 ... polen) ? Bo jak ktoś ma w rekordzie np. 40 pól (czyli dużo) to przepisywanie tego może być co najmniej upierdliwe biggrin.gif

2. No wiem, że to jest warunek LUB i logiczne, że skopiował, tak jak myślałem 2 zapytania, zamiast 3, ale jak zrobić żeby te trzy skopiował?
Szukałem czy w MySQL są jakieś tablice myśląc że może takie coś będzie się dało napisać:

Kod
WHERE id=ARRAY(1,2,1)


...I wtedy by dodawał lecz czegoś takiego niestety nie ma biggrin.gif

Na razie mam to zrobione w pętli, że jak ma np. 19 rekordów skopiować to robi 19 zapytań, ale wolałbym to wszystko w jednym zapytaniu - chodzi o wydajność.
erix
Cytat
1. A nie ma krótszej drogi do zapisania tego niż (pole1, pole2, pole3 ... polen) ? Bo jak ktoś ma w rekordzie np. 40 pól (czyli dużo) to przepisywanie tego może być co najmniej upierdliwe

Z tego, co pamiętam, to było coś takiego, jak select into .... winksmiley.jpg
Skie
SELECT INTO także się "wykrzacza" przy użyciu '*' ;-)
erix
  1. INSERT INTO sda SELECT * FROM asd

U mnie poszło...
Skie
A próbowałeś z tą samą tablicą?

Bo jeżeli u mnie nie działa a u Ciebie tak to znaczy, że:
1. Albo nie można kopiować w ten sposób w tej samej tablicy
2. Pole `desc` mi wykrzacza to zapytanie
3. Coś mam nie tak z ustawieniami MySQL haha.gif
erix
Z tą samą już nie. I wątpię, aby działało w ramach jednej. Nie podałeś deklaracji tabeli, to ciężko powiedzieć.

Ale zrób sobie tabelę tymczasową, skopiuj tabelę "na czysto", truncate na źródłowej i kopiowanie z powrotem.
kombajn
Aby skopiować w obrębie tej samej tabeli z jednego rekordu do drugiego tylko wybrane pole można użyć:

UPDATE tabela t1, tabela t2 SET t1.pole=t2.pole WHERE t1.id_pola=1 and t2.id_pola=2

Dla kilku pól analogicznie...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.