←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Plugin + baza danych

  • +
  • -
G[o]Q - zdjęcie G[o]Q 23.07.2014

chodzilo mi o relacje w relacjach nr1 i 2 czyli jedno id jeden nick i jedno id jedna bron :P

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 23.07.2014

To w takim razie jeszcze raz wyjaśnij o co Ci chodziło... nie rozumiem czemu się pytasz po co kilka rekordów?
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 23.07.2014


jak dodać kilka nowych rekordów do jednej z tabel

 

tego nie zrozumialem myslalem że chce dodać kilka rekordów w jednym zapytaniu mając dane pogrupowane w relacjach w których kolumny są w relacji 1:1

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 24.07.2014

Ahh... no da się tym sposobem wrzucić kilka różnych rekordów w prosty sposób:

INSERT INTO posiada (gid,bid)
SELECT g.gid, b.bid FROM gracz AS g INNER JOIN bron AS b ON 1=1 WHERE (g.nazwa='%s' AND b.nazwa='%s') OR (g.nazwa='%s' AND b.nazwa='%s');
Nie ma chyba potrzeby tłumaczyć, jak to zadziała :)

Co ciekawe, wcześniejszym sposobem z zagnieżdżonymi selectami się nie da, bo nie mamy możliwości "powiedzenia" SQLowi które rekordy mają ze sobą iść w parze...

Problem jednak pojawia się, gdy chcemy wstrzyknąć własne dane do tego... Ale rzuciłem na stacku pytanie o to, więc być może za chwilę będzie na to sposób ;)

http://stackoverflow...om-other-tables

Ogólnie polecam stackoverflow przy tego typu problemach.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 24.07.2014

No mi właśnie chodziło o to, jak dodać kilka rekordów, a pisząc kilka, miałem na myśli tyle ile w łatwy sposób można dodać za pomocą zwykłego inserta oraz w taki sposób, aby wykorzystać "on duplicate key update" dla powtarzających się kluczy. Te przykładowe zapytanie było tylko po to, aby pokazać o co mniej więcej mi chodziło, tylko jeden rekord nie jest trudno dodać (są różne sposoby), problem zaczyna się w momencie, gdy chce się dodać, np. 100 rekordów za jednym razem.
sebul (24.07.2014 12:35):
Tak sobie teraz pomyślałem i przecież można by do tego wykorzystać funkcję sql, tylko czy aby na pewno na każdym hostingu jest dostęp do tworzenia własnych funkcji.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 24.07.2014

Funkcje nie zawsze są niestety dostępne. Poza tym jeśli coś się da zrobić funkcją, da się też bez...

ON DUPLICATE KEY UPDATE przy takim insercie da się użyć... pytanie tylko czy na stacku ktoś podsunie rozwiązanie ;)
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 24.07.2014

No miałem już pisać, że jednak te funkcje nie zawsze są dostępne, no i można też bez funkcji robić, tylko wtedy zapytanie było by bardzo długie, bo coś takiego
INSERT INTO posiada (gid,bid)
VALUES ((SELECT g.gid FROM gracz AS g WHERE g.nazwa='%s'),(SELECT b.bid FROM bron AS b WHERE b.nazwa='%s')),
((SELECT g.gid FROM gracz AS g WHERE g.nazwa='%s'),(SELECT b.bid FROM bron AS b WHERE b.nazwa='%s')) // i tak dalej
ON DUPLICATE KEY UPDATE // coś tam
jednak zajmuje sporo miejsca i jeszcze kwestia tego, czy duża ilość selectów, nie wpływa jakoś negatywnie.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 24.07.2014

a jak wprowadzasz dane do tego kodu? pokaż w jaki sposób chcesz tego użyć no chyba ze masz tablice z parami stringów i chodzi o to zeby dla kazdego elementu tablicy wykonac zapytanie wyżej podane i chcesz to zrobic w jednym zapytaniu? podaj jakies dane wejsciowe przyklad uzycia i rezultat

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 24.07.2014

Tabele, które podałem w tym temacie, są "z d*py", podałem je po to, aby pokazać o co chodzi, a że w tym temacie są poruszone dwie kwestie:
1. Można łatwo aktualizować x rekordów w bazie poprzez insert i duplicate key.
2. Nie dodajemy nowego pustego rekordu po tym, jak jakichś danych (np. gracza) nie ma w bazie.
To też zacząłem dyskusję na temat, jak to zrobić w przypadku kluczy obcych i nie mając id tych kluczy obcych. Bo skoro po zapytaniu select nie dostaniemy rekordu (także id), to też potem skąd niby wziąć id dla nowego rekordu do tabeli, gdzie te id jest potrzebne jako klucz obcy. W pewnym sensie, te zapytanie, które podałem we wcześniejszym poście, rozwiązywało by problem, ale teraz czy aby na pewno większa liczba selectów nie wpłynie negatywnie na działanie, no i czy nie da się tego zrobić jednak jakoś krócej.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 24.07.2014

da sie laczysz tabele wybierasz co chcesz i pakujesz do inserta

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 24.07.2014

Czy aby na pewno? Tak dla przypomnienia, mamy takie tabele
gracz (gid, nazwa)
bron (bid, nazwa)
posiada (gid, bid, unixtime) // dodałem jeszcze jedną kolumnę, która pomoże w opisaniu sytuacji
i powiedzmy, że mamy 1000 graczy oraz 100 broni i chcemy dla 30 graczy dodać po 10 broni, ale nie posiadamy id tych 30 graczy oraz nie posiadamy id tych 10 broni, mamy tylko same nazwy, dodatkowo chcemy jakoś złapać duplikację kluczy i w momencie duplikacji aktualizować czas. I jak to zrobić krócej? Na tym kodzie co podałem, wyglądało by to mniej więcej tak
INSERT INTO posiada (gid,bid,unixtime) VALUES
((SELECT g.gid FROM gracz AS g WHERE g.nazwa='%s'),(SELECT b.bid FROM bron AS b WHERE b.nazwa='%s'),UNIX_TIMESTAMP()),
((SELECT g.gid FROM gracz AS g WHERE g.nazwa='%s'),(SELECT b.bid FROM bron AS b WHERE b.nazwa='%s'),UNIX_TIMESTAMP()) // i tak dalej
ON DUPLICATE KEY UPDATE unixtime=UNIX_TIMESTAMP()
ale to będzie sporo znaków, bo tych nowych rekordów będzie 300.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 24.07.2014

Wykorzystujac kod Gwyna

INSERT INTO posiada (gid,bid) VALUES 
SELECT g.gid, b.bid FROM gracz AS g INNER JOIN bron AS b ON 1=1 WHERE (g.nazwa='%s' AND b.nazwa='%s') OR (g.nazwa='%s' AND b.nazwa='%s'),
SELECT g.gid, b.bid FROM gracz AS g INNER JOIN bron AS b ON 1=1 WHERE (g.nazwa='%s' AND b.nazwa='%s') OR (g.nazwa='%s' AND b.nazwa='%s'),

+ timestamp jedne select mniej

 

 

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 24.07.2014

Nie kumam tego zapytania, dwa selecty do jednego inserta? I po co ten OR? Dodatkowo "+ timestamp jedne select mniej" czyli? A jakbym dodał jeszcze jedną kolumnę, którą chciałbym też aktualizować w przypadku duplikacji?
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 24.07.2014

kazda linijka to zestaw nastepnych danych a co sie dzieje przy duplikacji robisz po insercie (nie chcialo mi sie robic nawiasów)

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 24.07.2014

Nie nie nie :)

INSERT INTO posiada (gid,bid) VALUES 
SELECT g.gid, b.bid FROM gracz AS g INNER JOIN bron AS b ON 1=1 WHERE (g.nazwa='%s' AND b.nazwa='%s') OR (g.nazwa='%s' AND b.nazwa='%s');
doda DWA rekordy, po to jest ten OR :) Z połączonych tabel gracz i bron zostaną wyciągnięte 2 rekordy dzięki niemu.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 24.07.2014

doda DWA rekordy, po to jest ten OR smile.png Z połączonych tabel gracz i bron zostaną wyciągnięte 2 rekordy dzięki niemu.

I w sumie tak właśnie to rozumiałem, ale goq coś nakręcił :D
A żeby było z duplicate key, to rozumiem, że
INSERT INTO posiada (gid,bid,unixtime) VALUES
SELECT g.gid, b.bid, UNIX_TIMESTAMP() FROM gracz AS g INNER JOIN bron AS b ON 1=1 WHERE
(g.nazwa='%s' AND b.nazwa='%s') OR
(g.nazwa='%s' AND b.nazwa='%s')
ON DUPLICATE KEY UPDATE unixtime=UNIX_TIMESTAMP()
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 24.07.2014

nie zwrocilem uwagi na WHERE i nie zauwazylem OR moj błąd

Odpowiedz

KlimaT - zdjęcie KlimaT 03.10.2016

No, czy mógłbyś mi wytłumaczyć dlaczego mi duplikuje nicki w top 15?????? Maskara... Nie mam pojęcia dlaczego tak jest,, Każdemu na moim serwie się tak dzieje 

Załączone miniatury

  • ad asdadas.png
Odpowiedz