Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Połaczyć INSERT z SELECT
pabbito
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 26.03.2004
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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?

Ten post edytował pabbito 3.06.2006, 18:22:26
Go to the top of the page
+Quote Post
pabbito
post
Post #2





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 26.03.2004
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Czy tak niezrozumiale zadałem pytanie że nikt nie odpowiada?
Go to the top of the page
+Quote Post
bendi
post
Post #3





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
pabbito
post
Post #4





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 26.03.2004
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.

Ten post edytował pabbito 4.06.2006, 18:07:30
Go to the top of the page
+Quote Post
pabbito
post
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 26.03.2004
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
bendi
post
Post #6





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
pabbito
post
Post #7





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 26.03.2004
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


No jasne, że lepiej (IMG:http://forum.php.pl/style_emoticons/default/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:)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.12.2025 - 16:21