![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 24.05.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
witam,
podczas pisania pewnego projektu natknalem sie oczywiscie na cos czego nie potrafie zrobic w "ładny sposób". chce przerzucic z jednej tabeli do drugiej pewne wartosci z pól. Nie sa to wszystkie wartosci, tylko okreslone (i nie sa w tej samej kolejnosci). w manualu MySQL jest skladnia INSERT SELECT, ktora w zasadzie powinna rozwiazac moj problem, ale widac zle jej uzywam :-( mam cos takiego : Kod $zapytanie="INSERT INTO tabela2 VALUES ('id','partner','id','email','nazwa','link','katalog') SELECT FROM tabela1 WHERE partner='$ident";
tabele maja rozna ilosc pol. wartosc pierwsza id to autoinkrementacja, a druga id to wartosc którą chcialbym pobrac z tabeli1. (wiem ze to co napisalem jest zle ![]() Mozna to oczywiscie zrobic w petli dwoma zapytaniami, ale czasami warto sobie utrudnic :-) Prosze wszystkich "wiedzacych" jak zadac takie zapytanie o pomoc. -------------------- ------
aven |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
[sql:1:187cfbcd69]
INSERT INTO tabela2 (id, partner, inny_id, email, nazwa, link, katalog) SELECT NULL, partner, id, email, nazwa, link, katalog FROM tabela1 WHERE partner='$ident' [/sql:1:187cfbcd69] Uwagi: - po nazwie tabeli wystepuja nazwy z tabeli do ktorej wsadzasz wiec istnienie tam dwa razy id jest bez sensu, zalozylem ze pole nazywa sie id a to drugie to inny_id - dostosuj sobie - jesli pole jest autoincrement to mozesz albo je po prostu pominac w liscie pol, albo wsadzac tam wartosc NULL jak masz w przykladzie - wtedy zostanie wsadzona nastepna wartosc generowana - ilosc pol po tabela2 i w SELECTcie musi byc taka sama i w tej samej kolejnosci - sa one w tej kolejnosci przypisywane - dla mysql <4.0.14 nie mozna robic SELECT-a do bazy do ktorej INSERT-ujesz |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 24.05.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
dzieki za pomoc ...
pozmienialem, wyprobowalem i ... :-( [sql:1:9298c11d4f] INSERT INTO newsletter VALUES (id, partner_id, link_id, email, nazwa, link, kategoria) SELECT NULL, partner, id, email, nazwa, link, katalog FROM tabela WHERE partner='$identyfikator' [/sql:1:9298c11d4f] 1064 You have an error in your SQL syntax near 'SELECT NULL, partner, id, email, nazwa, link, katalog FROM tabela WHERE partne' at line 3 1064 to jest PARSE ERROR :-( liczba w values i select sie zgadza. probowalem bez nulla i id. probowalem bez nawiasow, z nawiasami eh :-(. - nazwy w values i select sa takie jak faktyczne kolumny w tabelach. - kolejnosc jest tez dobra co tu jest nie tak ? :-) pozdrawiam -------------------- ------
aven |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
[sql:1:331131b8dc]
INSERT INTO newsletter (id, partner_id, link_id, email, nazwa, link, kategoria) SELECT NULL, partner, id, email, nazwa, link, katalog FROM tabela WHERE partner='$identyfikator' [/sql:1:331131b8dc] Skad wytrzasnales to VALUES u siebie ? ![]() Skladnia jest INSERT INTO ... SELECT ... A nie INSERT INTO ... VALUES ... SELECT ... |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 24.05.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
faktycznie nie wiem skad to wzialem :-)
teraz dziala bez zarzutów dzieki wielkie !!!!! ![]() -------------------- ------
aven |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 24.05.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
do glowy wpadl mi jeszcze jeden pomysl ...
czy da sie sformulowac to zapytanie do bazy tak zeby jednoczesnie sprawdzalo czy gdzies w tabeli docelowej nie ma juz wpisu ktory ma byc do niej dodany? chodzi o to zeby do tabeli docelowej nie trafialy dwa razy te same rekordy. czy w mysql jest wogole taka skladnia ktora na to pozwala ? jesli nie ma to niestety bede musial i tak robic wszystko jeszcze raz kilkoma zapytaniami w php :-( pozdrawiam -------------------- ------
aven |
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
indexy unique?
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
Jabol: nie chodzi o wywalenie zapytania, ale o wstawienie tylko potrzebnych indeksow.
Da sie, ale po pierwse mysql 4.0.14 dopiero to wspiera i jest to ze wzgledu na brak podzapytan dosc trudne i zagrzybione. Mam to poskladac ? |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 24.05.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
w zasadzie na serwie na ktorym sie to znajduje jest chyba nawet wyzsza wersja php.
mysle jednak ze jest to i tak nie na moja glowe, wiec sobie juz poradzilem inaczej :-) -------------------- ------
aven |
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
ubootd: kazdy sposob jest dobry
a wogole to mozna to zrobic tak: wczesci select dac podselect (jak powiedzaj ubootd)[sql:1:79672ebea6]WHERE id not in ( select id from table );[/sql:1:79672ebea6] //edit ubottd:ahhh i znowy tylko przeglodam posty... pokarz jak bo sam jestem ciekawy |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
A bos dawno mysqla nie mial i sie Ci w d... poprzewracalo !
![]() [sql:1:8f678cebe9] insert into tabela2 (pola...) select pola... from tabela1 left join tabela2 on tabela1_id = tabela2_id where tabela2_id is null; [/sql:1:8f678cebe9] Aven: wersja mysql-a nie php-a. Nie ma w tej chwili oficjalnego mysql-a wyzszego od 4.0.14. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
uboottd: ale to musialbys dac outer joina?
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
Mozna prosic calym zdaniem ?
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Aby osiagnoc zamierzony przez Ciebie efekt join wymaga byc outer joinem (a AFAIK defaultowy to inner join) wiec skladnia powinna byc.[sql:1:aa7b797628]INSERT INTO tabela2 (pola...)
SELECT pola... FROM tabela1 LEFT OUTER join tabela2 ON (tabela1_id = tabela2_id) WHERE tabela2_id IS NULL;[/sql:1:aa7b797628]Tak conajmniej mi sie wydaje. przy inner joinach nie daje nulla przy łączeniu tylko po prostu nie łączy pól bez odpowieników. |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
W zasadzie a i owszem, ale nie do konca. Widzisz jakas zasadnosc zapisu LEFT INNER JOIN ? Bo zapis ten jest zreszta nielegalny. Wiec slowko OUTER staje sie w tym momencie opcjonalnym dodatkiem - sklejenie i tak jest outer.
A, i lacza sie wiersze a nie pola ![]() |
|
|
![]()
Post
#16
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
chyba rzeczywiscie dawno mysql nie mialem (za dawno ... ). Ale jak ktos kiedys mondrze powiedzial (nie o tym, ale to szczegół), "w jedną stronę trudno, w drugą niemożliwe".
|
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
W obie strony mozna, trza tylko pamietac o zwyczajach.
postgres tez nie przyjmie Ci left inner join. |
|
|
![]()
Post
#18
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
ale "left join" oznacza "inner join" o ile wiem na mysqlu? a ogolnie to wlasciwie nie wiem... kurcze, bo w mysqlu left i right join to to samo, czyli są inner, ale w postgresie chyba rzeczywiście defaultowo jest outer w takich przypadkach i dla inner trzeba napisac inner albo lanczyc przez where.
|
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
Dobra, to jasno i prosto:
Sklejenie mozebyc _albo_ INNER _albo_ jedno z LEFT, RIGHT, FULL ktore moga byc tylko i wylacznie OUTER. I podanie OUTER jest opcjonalne bo nic nie zmienia. Mozna inaczej powiedziec ze LEFT, RIGTH i FULL sa rodzajami sklejenia OUTER. I dotyczy to wszystkich normalnych serwerow bazodanowych (a co namniej Oracla, MySQL-a i PostgreSQL-a) bo wynika to z teorii. A, i powalilo ? na Mysqlu LEFT i RIGHT nie jest jednoznaczne. Oznacza dokladnie to co powinno.. |
|
|
![]()
Post
#20
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
1 ostatnio mało sypiam ;P
2 ktos ostatnio na forum cytował manuala 3 zostawmy ten temat bo cos mi sie mieszac zaczyna |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 13:06 |