Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Kopiowanie rekordów między tabelkami
Forum PHP.pl > Forum > Przedszkole
RawBlue
Witam

Posiadam 2 tabelki:

Kod
id     user  sztuk
1     nick 10
2     nick2 20
3     nick3 30


Kod
id     nick     polecony  ilosc
1     nick    test1 0
2     nick2    test3 0
3     nick3    test3 0


Chcę przekopiować rekord "sztuk" z pierwszej tabelki do "ilosc" w drugiej czyli:
Kod
INSERT INTO tabela2 (ilosc)
SELECT sztuk
FROM tabela1;

Chcę dodać warunek, że kopiuje zawartość jeśli w komórce "polecony" jest to samo co w komorce "user"

Nie mam pojęcia jak to ująć
CuteOne
1. Pobierasz rekordy z pierwszej tabeli - zapisując je do tablicy
2a. Updateujesz rekordy wg nicku danymi z tablicy
2b. Zapisujesz rekordy jak leci danymi z tablicy
-RawBlue-
Nie da się tego skopiować z WHERE polecony = user
singollo
Jeśli dobrze rozumiem: nie chcesz "skopiować", tylko zaktualizować tabelę tabela2 danymi z tabeli tabela1, dla rekordów, w których tabela1.nick = tabela2.polecony ? Odpowiedni to będzie raczej UPDATE niż INSERT:

  1. UPDATE tabela1, tabela2 SET tabela1.ilosc = tabela2.sztuk WHERE tabela1.nick = tabela2.polecony


http://dev.mysql.com/doc/refman/5.0/en/update.html
-RawBlue-
Cytat(singollo @ 2.04.2012, 08:35:51 ) *
Jeśli dobrze rozumiem: nie chcesz "skopiować", tylko zaktualizować tabelę tabela2 danymi z tabeli tabela1, dla rekordów, w których tabela1.nick = tabela2.polecony ? Odpowiedni to będzie raczej UPDATE niż INSERT:

  1. UPDATE tabela1, tabela2 SET tabela1.ilosc = tabela2.sztuk WHERE tabela1.nick = tabela2.polecony


http://dev.mysql.com/doc/refman/5.0/en/update.html


Zgadza się ale po użyciu Twojej komendy zamiast zaktualizować dodaje mi nowe rekordy
mortus
Kolega singollo kolumny pomieszał:
  1. UPDATE tabela1, tabela2 SET tabela2.ilosc = tabela1.sztuk WHERE tabela1.nick = tabela2.polecony

Mimo to nie ma takiej możliwości, aby powyższe zapytania dodawały nowe rekordy, więc przepatrz kod i sprawdź, czy nie masz gdzieś jakiegoś INSERT-a.
Zastanowiłbym się jeszcze nad poprawnością organizacji bazy danych. Bo przecież i polecający, i polecony to użytkownik systemu, którego dane znajdują się/powinny się znajdować w tabeli użytkowników. W związku z powyższym tabela zawierająca listę polecanych i polecających (wraz z dodatkowymi informacjami) powinna korzystać z identyfikatorów użytkowników zapisanych w tabeli użytkowników, a nie z ich loginów, przynajmniej tak byłoby poprawniej (i raczej tylko tak). Jeszcze inną kwestią jest zapisywanie identycznych informacji/danych w dwóch różnych tabelach... tego właśnie powinno się unikać, a dane powiązane unikalnym id można zawsze pobierać z dwóch różnych tabel używając złączeń (JOIN), czy nawet zwykłego SELECT.
-RawBlue-
Cytat(mortus @ 2.04.2012, 09:09:59 ) *
Kolega singollo kolumny pomieszał:
  1. UPDATE tabela1, tabela2 SET tabela2.ilosc = tabela1.sztuk WHERE tabela1.nick = tabela2.polecony

Mimo to nie ma takiej możliwości, aby powyższe zapytania dodawały nowe rekordy, więc przepatrz kod i sprawdź, czy nie masz gdzieś jakiegoś INSERT-a.
Zastanowiłbym się jeszcze nad poprawnością organizacji bazy danych. Bo przecież i polecający, i polecony to użytkownik systemu, którego dane znajdują się/powinny się znajdować w tabeli użytkowników. W związku z powyższym tabela zawierająca listę polecanych i polecających (wraz z dodatkowymi informacjami) powinna korzystać z identyfikatorów użytkowników zapisanych w tabeli użytkowników, a nie z ich loginów, przynajmniej tak byłoby poprawniej (i raczej tylko tak). Jeszcze inną kwestią jest zapisywanie identycznych informacji/danych w dwóch różnych tabelach... tego właśnie powinno się unikać, a dane powiązane unikalnym id można zawsze pobierać z dwóch różnych tabel używając złączeń (JOIN), czy nawet zwykłego SELECT.


Aktualizuje komorke ilosc ale niestety w nowych rekordach i dodaje mi tyle rekordow ile mam w pierwszej tabeli choc wykonuje to przez "phpmyadmin"

Wiem, że lepiej nie rozkładać na różne tabele tego samego ale pisze system % z poleconych i już mam koncepcje dlatego potrzebuje przekopiować te rekordy.
mortus
Cytat(-RawBlue- @ 2.04.2012, 10:29:41 ) *
Aktualizuje komorke ilosc ale niestety w nowych rekordach i dodaje mi tyle rekordow ile mam w pierwszej tabeli choc wykonuje to przez "phpmyadmin"

Wiem, że lepiej nie rozkładać na różne tabele tego samego ale pisze system % z poleconych i już mam koncepcje dlatego potrzebuje przekopiować te rekordy.

Trochę się mieszasz, według tego co napisałeś na początku w pierwszej tabeli nie ma kolumny ilość, jest tylko w drugiej tabeli. Jeśli dodaje Ci rekordy, to może masz założonego TRIGGER-a INSERT BEFORE/AFTER UPDATE? No i jeszcze kwestia tego "% poleceonych", jeśli dobrze zbudujesz bazę danych, to taki % poleconych będzie można wyliczyć w jednym zapytaniu.
RawBlue
Trochę się pomieszało więc zaczne od początku

Mam dwie tabele takie jak w pierwszym poscie:
tabela1(id, user, sztuk) -4k rekordów
tabela2(id, nick, polecony, ilosc) -500 rekordów

Ja potrzebuje przekopiować zawartość tabela1(sztuk) do tabela2(ilosc) pod warunkiem, że tabela2(polecony) jest taki sam jak tabela1(user)

Powyższe rozwiązanie kopiuje wszystkie 4k rekordów z tabela1 tak jak by nie uwzględniało warunku.


Co do % to dopiero się uczę więc robie według swojej koncepcji biggrin.gif
mortus
Cytat(RawBlue @ 2.04.2012, 10:48:55 ) *
Trochę się pomieszało więc zaczne od początku

Mam dwie tabele takie jak w pierwszym poscie:
tabela1(id, user, sztuk) -4k rekordów
tabela2(id, nick, polecony, ilosc) -500 rekordów

Ja potrzebuje przekopiować zawartość tabela1(sztuk) do tabela2(ilosc) pod warunkiem, że tabela2(polecony) jest taki sam jak tabela1(user)

Powyższe rozwiązanie kopiuje wszystkie 4k rekordów z tabela1 tak jak by nie uwzględniało warunku.

No i rzeczywiście nie uwzględnia, bo w tabela1 nie ma kolumny nick, a jest kolumna user. Nie zauważyłem jeszcze jednej pomyłki w powyższym zapytaniu i powtórzyłem błąd:
  1. UPDATE tabela1, tabela2 SET tabela2.ilosc = tabela1.sztuk WHERE tabela1.user = tabela2.polecony


Cytat(RawBlue @ 2.04.2012, 10:48:55 ) *
Co do % to dopiero się uczę więc robie według swojej koncepcji biggrin.gif

Chodzi mi przede wszystkim o optymalność rozwiązania, zarówno po stronie bazy danych, jak i samej aplikacji. Posługiwanie się kolumnami typu tekstowego niestety do najbardziej wydajnych operacji nie należy. O wiele szybciej wykonywane są operacje na kolumnach typu int w dodatku indeksowanych, nawet jeśli trzeba korzystać ze złączeń.
Po co robić coś, co później trzeba będzie zmieniać, tym bardziej, że rekordów jest już troszkę.
RawBlue
Jednak działa
mortus
Cytat(RawBlue @ 2.04.2012, 11:46:28 ) *
Jednak działa

Działa, ale to są dwa różne zapytania, przypatrz się dobrze.
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.