[MySQL] Jak skontrukowac zapytanie

0

Mam zapytanie:

insert into tabela (id,nazwa,kolor) VALUES (NULL,'talerz','niebieski'); - gdzie od id to autoincrement a jak zrobic zeby zrobic to samo zapytanie ale wstawiajac to id w pole varchar np:

insert into tabela (id,nazwa,kolor,id_stare) VALUES (NULL,'talerz','niebieski',tu ma byc to id z pozycji pierwszej)

W miejsce id_stare ma wejsc to co jest pod id czyli ten autoincrement jak to tu wsadzic?

insert into tabela (id,nazwa,kolor,id_stare) VALUES (NULL,'talerz','niebieski',????)

0

Przede wszystkim jaka baza?. Po drugie czemu w pole varchar?
W MSSQL to zmienna zdaje sie SCOPE_IDENTITY
w MySql o ile pamietam to funkcja GET_LAST_INSERT_ID();

0

Mysql - sorki zapomnialem napisac.
Robie baze produktow i kazda edycja produktu ma byc tak zapisywana ze tworzy sie kopia rekordu z data, userem ktorym zmienia i teraz musze jakos polaczyc te pola zeby bylo wiadomo ze o ten sam produkt chodzi.
Np mam
Produkt 1 i on ma id=1 , ktos przychodzi i cos w nim zmienia , czyli tworzy drugi rekord:
Produkt 1 zmienienony i on ma ID_(wlasnie dlatego varchar tzn moze byc int w sumie) = 1 , trzecia zmiania:
Produkt 1 i ID_ = 1

POle ID_ wiąze te 3 rekordy, jeszcze mam problem bo mam pola data i typ timestamp , musze wyswietlic rekord ale najbardziej aktualny czyli ten ktory zostal ostatnio zmieniony czyli MAX(data) ale zdaje sie ze nie ma tak latwo i MAX (data) nie zda egzaminu ale przeciez moge po MAX(id) pojechac to to samo chyba nie? :) bo kazdy rekord oczywiscie ma swoj unikalny ID.

No wlasnie mam takei rekordy w bazie:

id=1 nazwa=aaaa id_=1
id=2 nazwa=aaaa id_=1
id=3 nazwa=aaaa id_=1
id=4 nazwa=aaaa id_=2
id=5 nazwa=aaaa id_=2

teraz chce wyswietlic te rekordy z najwzyszym id w danej grupie id_
Jak to zrobic?czyli tu musialyby sie wyswietlic wiersze o id=3 i id=5

0

Dalej nie rozumiem czemu varchar - przeciez to takie samo id jak tamto... To nie lepiej int, jak tamto? Latwiej bedzie zaznaczac, ktory jest aktualnym wierszem - czyli robisz update na danym id, zeby zaznaczyc, ze nie jest juz aktualny, po czym wstawiasz nowy wiersz z zaznaczeniem, ze jest aktualny.

0

triger, stored proc, a w wersjach nie posiadających ww to kupa zabawy

0

Wymyslilem cos takiego:

select * from tabela where id IN (select MAX(id) from tabela group by _id))

proste:)

A co do varchar na id_ to faktycznie musi byc INT lepiej :)

0
Glina napisał(a)

proste:)

i wysypie sie predzej czy pozniej ...

0
Misiekd napisał(a)

i wysypie sie predzej czy pozniej ...

Czemu sie ma wysypac?

0

bo MAX(id) nie gwarantuje Ci, że jest to id rekordu, który przed chwilą wstawiłeś

0
Misiekd napisał(a)

bo MAX(id) nie gwarantuje Ci, że jest to id rekordu, który przed chwilą wstawiłeś

Rozumiem ze wg Ciebie majac id rowne kolejno 1,2,3,4,5,6 , wykonanie MAX(id) nie gwarantuje mi ze zapytanie zwroci wartosc 6 ?

0

przeczytaj swoje pytanie z pierwszego postu a potem moją poprzednią odpowiedź - taki sposób nie gwarantuje Ci, że id, które dostaniesz TO JEST ID DODANEGO WŁAŚNIE PRZEZ CIEBIE REKORDU

hint: ktoś inny mógł dodać następny rekord

0

Jezeli chodzi o moj pierwszy post to zmienilem podejscie , przed zrobieniem inserta wykonuje selecta i sprawdzam jaki jest MAX(id) potem go inkrementuje i dodaje w insercie. Oczywsicie zabezpiecznie ze jezeli brak rekordow to id ma byc rowne 1. Wydaje mi sie to podejscie jest najbardziej w porzadku. Wtedy pole id nie musi byc autoincrement i id moge wstawic w tyle p[ol ile bede chcial.

0

w ten sposób możesz mieć kilka wpisów z takim samym ID - to nie jest dobre rozwiązanie!

0
Misiekd napisał(a)

w ten sposób możesz mieć kilka wpisów z takim samym ID - to nie jest dobre rozwiązanie!

Dlaczego? Pole id mam typu INT ale ustawione jako unikalne wiec nie ma takiej opcji.
A po drugie jezeli wpis do ID mam postaci Max(id)+1 to jak moge miec takie samo ?

0

ja piernicze jak w tym samym czasie wykonasz dwa razy to zapytanie to dostaniesz dwie takie same wartości i będziesz próbował wpisać dwa razy rekord z tym samym ID. kapujesz??

dla mnie EoT bo to jak grochem o ścianę...

0
Misiekd napisał(a)

ja piernicze jak w tym samym czasie wykonasz dwa razy to zapytanie to dostaniesz dwie takie same wartości i będziesz próbował wpisać dwa razy rekord z tym samym ID. kapujesz??

dla mnie EoT bo to jak grochem o ścianę...

No kapuje kapuje ale czemu mam wykonac 2 razy to samo zapytanie bo nie wiem, po zapytaniu mam headera-a wiec nikt mi nie zarzuci odswierz, wytlumacz mi jakim cudem wykonam zapytanie 2 razy ?

0

a nie wziąłeś pod uwagę, że jednocześnie może na bazie działać więcej niż jeden user :>

0

Witam
Widzę, że temat zakurzony, a tytuł dobry więc umieszczę swój problem tutaj.

Mianowicie mam problem z zapytaniem (chodzi o MySQL) które wyciąga mi z bazy listę pewnych wyników oprócz powiedzmy dwóch najsłabszych. Początkowo chciałem zrobić tak:

SELECT gracze.nick, SUM(wyniki.pkty)
FROM gracze, wyniki
WHERE gracze.IDgracza=wyniki.IDgracza AND wyniki.pkty IN
(
SELECT wyniki.pkty
FROM gracze, wyniki
WHERE gracze.IDgracza=wyniki.IDgracza LIMIT 10
)
GROUP BY gracze.nick;

// przy założeniu, że powiedzmy zamiast odrzucać dwa najgorsze wybieramy 10 najlepszych - interesują mnie oba rozwiązania

Przy takim zapytaniu wyrzuca mi komunikat, że bieżąca wersja nie obsługuje jeszcze "LIMIT" w podzapytaniach... (mam wersje 5.0)

Ma ktoś może jakiś pomysł jak to zrobić, dopiero zaczynam przygodę z bazami, a w necie nie mogłem znaleźć nic co by mi pomogło?

Pozdrawiam!!!

0

zobacz coś takiego

SELECT g.nick, SUM(w.pkty) 
FROM gracze g, wyniki w
WHERE g.IDgracza = w.IDgracza
GROUP BY g.nick
ORDER BY 2
LIMIT 10
0

Tzn. niedokładnie oto mi chodziło.

Struktura bazy wygląda tak, te dwie interesujące nas tabele:

GRACZE: IDgracza, nick
WYNIKI: IDturnieju, IDgracza, miejsce, pkty

(mam jeszcze tabele TURNIEJE: IDturnieju, IDligi, data)

Wyniki poszczególnych turniejów zapisuje w tabeli WYNIKI, np takie wyniki:
TURNIEJ NR 1

  1. graczA (id: 1)
  2. graczB (id: 2)
  3. graczC (id: 3)
    TURNIEJ NR 2
  4. graczB
  5. graczA
  6. graczC

Mam powiedzmy tak:

ID_T, ID_G, MIEJSCE, PKTY
1, 1, 1, 10
1, 2, 2, 8
1, 3, 3, 4
2, 2, 1, 10
2, 1, 2, 8
2, 3, 3, 4

I teraz chodzi o to, żeby wyciągnąć sumę punktów dla każdego gracza, odrzucając w tej sumie dwa najsłabsze punktowo wyniki (albo alternatywnie biorąc najlepszych 10 wyników). Przy czym zakładam, że rozegrano już powiedzmy 15 turniejów.

Mam nadzieję, że nie zagmatwałem :)

0

to najprościej i chyba najmniej obciążając serwer będzie to zrobić przy pomocy stored proc

0

ok wielkie dzięki za pomoc, doczytam sobie o 'stored proc'

pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1