Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] INSERT połączony z SELECT
Forum PHP.pl > Forum > Przedszkole
vokiel
Mam taki mini problem.
Dodaję sobie listę użytkowników z adresami email. W bazie przechowuję oddzielnie adresy email (z innymi danymi), a oddzielnie dane danego użytkownika (wraz z innymi danymi). Struktura w uproszczeniu wygląda tak:
USR (ID, NAME ....)
USR_MAILS (USR_ID, EMAIL ....) (USR_ID wskazuje na tablę USR pole ID smile.gif )

Teraz chciałbym aby dodawanie użytkowników przebiegało w możliwie jak najmniejszej liczbie zapytań. Co do samego INSERT dla USR to sprawa jest prosta (w uproszczeniu):
  1. foreach ($odbiorcy as $odbiorca){
  2. $query_usr = ",('".$odbiorca['name']."')";
  3. }
  4. $query = 'INSERT INTO `USR`(`NAME`) VALUES '.substr($query,1).';';


Natomiast dodawania maili do USR_MAILS w jednym zapytaniu już nie potrafię stworzyć.
Mam 2 rozwiązania:
1. Iterując po odbiorcach mogę tworzyć INSERT ... SELECT dla USR_MAILS i podawać w parametrze nazwę
2. Pobierać lastInsertId, i dodawać do drugiego zapytania (jednak wtedy pierwsze zapytanie musiałoby być oddzielnie dla każdego wpisu)

Macie może pomysły na jakieś inne rozwiązanie? Jest jakaś opcja INSERT wraz z JOIN?
Bo jak na razie mam 1 zapytanie dla USR i n zapytań dla USR_MAILS lub n zapytań dla USR i jedno zapytanie dla USR_MAILS.
seth-kk
last_insert_id i/lub insert ... select
vokiel
Cytat(seth-kk @ 15.10.2009, 11:24:42 ) *


To już mam w rozwiązaniach które podałem na końcu. Dążyłem do tego, żeby ogarnąć to w 2 zapytania, a nie ilość_usr +1 ;>
seth-kk
sorry zle zrozumialem, w takiej sytuacji pozostaje chyba tylko stworzenie widoku i na nim robienie insertow
jmail
ale chodzi Ci o to, żeby w PHP mieć jedno zapytanie? Bo przecież wydajnościowo Twoje jedno zapytanie jest takie samo jak x insertów. Jeżeli chcesz mieć jedno zapytanie w php to zrób to cursorem na przekazanych danych

//edit

chodzi o to, żeby w MySQL napisać funkcję do której przekażaesz dane a w samej funkcji przetworzysz je jak arraya normalnego (przez coś ala split) i przelecisz w pętli po danych
vokiel
Tak sobie teraz myślę, że szkoda zachodu. Jeśli nie będzie konieczności dodawania tysięcy wpisów na raz zostanie na sposobie z lastinsertid.

Możliwość z widokiem po dodaniu triggera załatwiłaby sprawę. Dodać wpis razem (usr + usr_email) a następnie trigger na takiego inserta, który by to rozdzielił na dwie tabele. Jednak takie rozwiązanie wymaga więcej pracy, i wątpię czy będzie wydajniejsze...

Dzięki za pomysły smile.gif
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.