Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] przepisanie id insertowanego rekordu do innych kolumn
Forum PHP.pl > Forum > Bazy danych > MySQL
szczypior
Witam

Zdarza się taki przypadek, że wykonując insert do tabeli, w której id jest auto_increment muszę to id umieścić również w tym rekordzie w innych polach.

tabela wygląda tak:
id | pole1 | pole2 | pole3 | pole4 |

zapytanie:
  1. INSERT INTO tabela(pole1,pole2,pole3,pole4) VALUES ('$pole1','$pole2','$pole3','$pole4')


Chcę uzyskać taki wpis aby wartość z pola id była wpisana też w pole2 i 4. W innych przypadkach pola te mają zupełnie inne wartości, więc nie mogę z nich po prostu zrezygnować.

Jest jakiś inny sposób poza robieniem wcześniej selectu ostatniego id?

Pozdrawiam i życzę Wesołych Świąt smile.gif
nevt
to jest bez sensu...
można to zrobić, ale to znaczy, że masz źle zaprojektowaną bazę lub struktury danych w programie...
dlaczego powielasz zawartość indeksu zamiast odwoływac się bezpośrednio do pola `id` ?
szczypior
Tabela zawiera posty i odpowiedzi na nie. Id identyfikuje konkretny post/odp. Jest też kolumna zawierająca id ostatniej odpowiedzi dla danego postu. Gdy post nie ma odpowiedzi kolumna ta zawiera id tego postu, po to aby łatwiej można było wyciągnać np 10 ostatnich rekordów (postów lub starszych postów dla których odpowiedz znajduje się w grupie najnowszych 10 rekordów). Gdy pada odpowiedz na post, zmieniana jest wartość w komórce ostatniej odpowiedzi na id postu odpowiedzi.

Gdy dla postów bez odpowiedzi dam 0 w kolumnie "id ostatniej odp" to wtedy tracę możliwość odpowiedniego posortowania ich.
nevt
najpierw:
Cytat
Chcę uzyskać taki wpis aby wartość z pola id była wpisana też w pole2 i 4.

a potem...
Cytat
Gdy pada odpowiedz na post, zmieniana jest wartość w komórce ostatniej odpowiedzi na id postu odpowiedzi.

wg mnie to są dwa zupełnie różne rekordy... napierw piszesz o zmianie 2 pól, a potem o zmianie jednego... dalej nie wiem o co ci chodzi... coś ściemniasz o problemach z wyciąganiem odpowiedzi... nadal bez sensu - nie ma odpowiedzi - to pole `id_odpowiedzi` powinno być NULL... poza tym powiązanie postu i odpowiedzi na niego powinno być zrobione w oddzielnej tabeli...
a tu:
Cytat
Gdy dla postów bez odpowiedzi dam 0 w kolumnie "id ostatniej odp" to wtedy tracę możliwość odpowiedniego posortowania ich.

to już zupełnie nie masz racji, poczytaj o funkcjach IF() oraz IFNULL(), skojarz to z ORDER BY i zrozumiesz że przepisywanie `id` do dodatkowych kolumn nie ma sensu...
Jeżeli chcesz wyciągać 10 ostanich postów / odpowiedzi - to nie polegaj na polu `id` - bo jego zawartość może ulec zmianie (np. w czasie przenoszenia bazy na inny serwer) i nie musi odzwierciedlać kolejności dodawania wpisów. Utwórz pole typu TIMESTAMP z domyślną wartością NOW() i sortuj wg niego...
powodzenia... wesołych i spokojnych świąt bożego narodzenia...
szczypior
Różnice w tym ile pój ma mieć to id wynikały z tego że oszczędziłem opisywanie dokładnie przypadku, a samego problemu. Ta druga kolumna w którą chciałem wpisać id zawiera id postu na który ten post jest odpowiedzią. Ten problem właśnie rozwiązałem (dzięki Twojej odpowiedzi) stosując null i funkcję IFNULL, czyli teraz gdy rekord jest postem wartość w kolumnie "odpowiedz" jest null, gdy rekord jest odpowiedzią na jakiś inny post ta kolumna zawiera id tego postu.

Teraz kombinuje jak rozwiązać to podobnie z ORDER BY

----
edit: problem z ORDER BY też już usunięty w ten sam sposób smile.gif
Dzięki za pomoc smile.gif Wesołych Świąt również życzę.

Co mi da oddzielenie od siebie do różnych tabel postów i odpowiedzi oraz stworzenie tabeli która będzie je sobie przyporządkowywać? Wydajniej będzie?
Indeo
Cytat
powiązanie postu i odpowiedzi na niego powinno być zrobione w oddzielnej tabeli

Niekoniecznie. Jeśli post składa sie z takich samych elementów jak wątek to po co mnożyć byty? Tutaj sprawa jest jeszcze prosta, bo zapewne chodzi o strukturę jednopoziomową, ale co by było gdyby wątki mogły być zagnieżdżane (komentarz do komentarza) dodawanie tabel niczego by nie dało, bo musiałoby być tabel n+1 tyle co poziomów winksmiley.jpg

Wystarczy jedna tabela.
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.