Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [SQL] Zmiana numerów ID na podstawie daty i godziny

Napisany przez: Salarieri 1.12.2019, 20:54:10

Witam. Mam problem z tabelką SQL, na który nie mogę znaleźć odpowiedzi w wyszukiwarce, dlatego postanowiłem napisać ten temat. W jednej kolumnie "data" mam daty i godziny (np. 2003-04-15 14:11:01), zaś w drugiej kolumnie "kolej" chciałbym porobić numery – wiersz o najwcześniejszej dacie i godzinie miałby mieć numer 1 i tak po kolei do ostatniego o najpóźniejszej dacie i godzinie.

Napisany przez: Tomplus 1.12.2019, 22:20:16

Zapytanie, posortuje wg daty:

  1. SELECT `data`, `kolej` FROM tabela ORDER BY `data` ASC


w pętli:

  1. $lp=0;
  2. foreach($wynikZapytania as $wiersz) {
  3. $lp ++;
  4. http://www.php.net/echo "<br>{$lp}. {$wierz['data']} {$wiersz['kolej']} ";
  5. }


Napisany przez: Salarieri 6.12.2019, 20:32:48

Dzięki za odpowiedź, ale to co wkleiłeś chyba jedynie wypisze mi wiersze z tabeli, a mi chodzi o zmianę w tabelce SQL, aby nadać nowe numery na tej zasadzie:

Tabelka ma ponad 11 tys. rekordów, więc ręczne wpisywanie chyba odpada, bo by się z tydzień z tym zeszło…

Napisany przez: viking 6.12.2019, 20:44:05

https://stackoverflow.com/questions/10485769/mysql-update-a-column-with-an-int-based-on-order

Napisany przez: trueblue 7.12.2019, 07:57:26

A w jakim celu potrzebujesz tą numerację bezpośrednio w tabelce?

Napisany przez: Salarieri 7.12.2019, 19:33:19

Cytat(viking @ 6.12.2019, 20:44:05 ) *
https://stackoverflow.com/questions/10485769/mysql-update-a-column-with-an-int-based-on-order


Dzięki za pomoc w znalezieniu, zadziałał ten kod:
  1. SET @counter = 0;
  2. UPDATE nazwa_tabeli
  3. SET kolej = @counter := @counter + 1
  4. ORDER BY DATA;


Cytat(trueblue @ 7.12.2019, 07:57:26 ) *
A w jakim celu potrzebujesz tą numerację bezpośrednio w tabelce?

Postanowiłem połączyć ze sobą trzy tabelki SQL z artykułami w jedną. W jednej najnowszej tabelce są artykuły od 2012 do obecnie, w drugiej archiwalne od 2003 do 2012, a w trzeciej na razie niedostępnej publicznie od 2005 do 2012. Wiadomo, musiałem poprzerabiać te starsze tabelki pod nowszą, czyli aby kolumny się tak samo nazywały – np. jedna kolumna z tą samą zawartością w jednej tabelce nazywała się "tresc", a w starszej "tekst", a także porobić w starszych dodatkowe kolumny z pustą zawartością, np. "linkfilm" (link do reportażu video), dodatkowo zmienić kodowanie tekstu i typ kolumn na jednakowe. Pewnym problemem był klucz podstawowy "id", który się w tabelkach powtarzał. Na początku pomyślałem, żeby w tej najnowszej tabelce pozmieniać numery id o 11 tys. do góry, ale to głupi pomysł, bo wtedy w Googlach by się pomieszało, ktoś wchodził by na link z wyszukiwarki i otwierał by się zupełnie inny artykuł niż potrzeba, dlatego też postanowiłem tego nie ruszać. Zastosowałem inne sprytne obejście z wykorzystaniem ułamków, np. artykuł archiwalny o id 5432 w tej najnowszej połączonej tabelce ma teraz id 0.5432, zaś np. o id 432 w nowszej to 0.0432. Druga archiwalna tabelka to samo tylko na początku 1. np. 1.212. Dzięki temu będę mógł łatwo zrobić przekierowanie w .htaccess, wcześniej zastanawiałem się nad liczbami ujemnymi, ale te ułamki to zdecydowanie lepszy pomysł. Oczywiście pozostał ten problem, że robiąc sortowanie według "id" miałbym nie poklei według daty, bo artykuły z numerami 0. są od 2003 do 2012, a z 1. od 2005 do 2012, miałbym na stronie najpierw od 2003 do 2012, a później znowu od 2005 do 2012 zamiast po kolei. Natomiast na stronie nie mogę dać sortowania kolejności artykułów według dat, ponieważ w najnowszej wersji są one sortowane według dodatkowej kolumny z numerkami "kolej", dzięki czemu administrator dodający do bazy artykuły ma możliwość przestawienia kolejności ich wyświetlania na stronie, może się tak zdarzyć, że wcześniej wrzucony artykuł jest ciekawszy i dłuższy, i warto go ustawić bardziej na początku.

Napisany przez: trueblue 7.12.2019, 20:03:36

Jeśli dobrze rozumiem, to chciałeś zachować ID i klucz sortowania tej najnowszej tabeli, tak?

ID starszych danych mogłeś zacząć od MAX(ID)+1 z najnowszej tabeli. Klucz sortowania najnowszej tabeli zwiększyć o wartość wynikającą z ilości rekordów w starych tabelach (Y), a potem rekordy w starych tabelach ponumerować od 1 do Y.

Napisany przez: Salarieri 8.12.2019, 14:00:16

No, Twój sposób też byłby dobry.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)