Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Połaczyć INSERT z SELECT
Forum PHP.pl > Forum > Bazy danych > MySQL
pabbito
Tym zapytaniem wybieram Stronę o najwyższym numerze kolejnosci:
  1. SELECT Kolejnosc FROM Strony WHERE Parent=0 ORDER BY Kolejnosc DESC LIMIT 1;

i chciałbym żeby wynik tego zapytania+1 był wykorzystany w poniższym INSERT'cie
  1. INSERT INTO Strony (Id_Strony, Nazwa, Tytul, Title, Tresc, Aktywna, Parent, Kolejnosc, Haslo, Typ, Menu) VALUES (13, 'Księga Gości', 'Księga Gości', '', 'Księga Gości', 1, 0, <!--o tutaj-->, 0, 0, 1);


1) Czy da się to zrobić tylko w MySQL, jakimś jednym złaczonym zapyaniem? Jeśli tak to jak?
2) Albo może można przechować wynik SELECT'a w jakiejś zmiennej sql'owej i potem wykorzystać zmienną w INSERT ? Jeśli tak to jak?

PS. Nie chodzi mi o rozwiązanie w php.

EDIT:
Nikt nie odpowiedział, ale szukałem rozwiązania sam i doszedłem do tego:
  1. SET @p:= (SELECT MAX(Kolejnosc) FROM Strony); INSERT INTO Strony (Id_Strony, Nazwa, Tytul, Title, Tresc, Aktywna, Parent, Kolejnosc, Haslo, Typ, Menu) VALUES (13, 'Księga Gości', 'Księga Gości', '', 'Księga Gości', 1, 0, @p, 0, 0, 1);


Tylko teraz mam pytanie: Jak zablokować tabelę Strony żeby w miedzyczasie warość maksymalnej kolejnosci nie uległa zmianie.

I drugie pytanie: Od jakiej wersji MySQL działa takie przypisywanie do zmiennej?
pabbito
Czy tak niezrozumiale zadałem pytanie że nikt nie odpowiada?
bendi
Nie wiem czy o to Ci chodzi, ale zamiast ustawiać zmienna możesz skorzystać ze składni:
  1. INSERT INTO table_name (col1, col2, col3) SELECT col1, col2, col3 FROM table_name2
pabbito
Sprawdziłem że moje rozwiązanie z 'SET' dla MySql 4.0 nie działa.

To o czym piszesz bendi jest prawie ok. Jesli wydam takie zapytanie:
  1. INSERT INTO Strony (Kolejnosc) SELECT MAX(Kolejnosc)+1 FROM Strony;

to owszem powstaje nowy rekord w tabeli Strony, który ma pole 'Kolejnosc' równe zwiekszonej o jeden maksymalnej Kolejnosci w tej tabeli.

Tylko ja potrzebuje żeby ten rekord który powstaje był od razu uzupełniony jeszcze o inne pola.

Dla uproszczenia: chciałbym żeby powstał rekord o Id_Strony równym 13 i by pole Kolejnosc miało zwiększoną o jeden maksymalną Kolejnosc z tabeli Strony. Jak takie coś uzyskać tylko za pomoca zapytań MySQL? (może być kilka)

Próbowałem już też taką drogą: utworzyłem nowy rekord z takimi danymi jakie chciałem oprócz tej kolejnosci, a potem chciałem zrobić UPDATE i uzupełnic Kolejnosc o maksymalną+1. Tylko za chiny nie wiem jak przechować tą wartość, żeby potem ją wstawić do update.
pabbito
No więc problem rozwiązałem w ten sposób:
  1. INSERT IGNORE INTO Strony (Kolejnosc) SELECT MAX(Kolejnosc)+1 FROM Strony; UPDATE Strony SET Id_Strony=13, Nazwa='Księga gości', Tytul='Księga gości' , Title='', Tresc='<p>Księga gości</p>', Aktywna=1 WHERE Id_Strony=LAST_INSERT_ID();


Dzięki bendi za podsunięcie pomysłu.

Jak ktoś ma komentarz do tego rozwiązania to proszę śmiało.
Dalej nie wiem jak spowodować żeby pomiedzy tymi zapytaniami nikt nie mógł wykonać innych zapytań modyfikujących.
bendi
A nie lepiej tak:
  1. INSERT IGNORE INTO Strony (Kolejnosc,Id_Strony,Nazwa,Tytul,Title,Tresc,Aktywna)
  2. SELECT MAX(Kolejnosc)+1,13,'Ksiega gosci','Ksciega gosci','', '<p>Ksiega gosci</p>', 1 FROM Strony;
pabbito
No jasne, że lepiej smile.gif Rewelacja! Dokładnie o takie cos mi chodziło. I kręciłem się w kółko obok tego rozwiązania. Nie wiedziałem że w SELECT można wstawiać konkretne wartości, myślałem że tylko poprzez odwołania do pól.

Dzięki serdeczne za pomoc! Nauczyłęm się czegoś nowego:)
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.