[MySQL] kolejność w ramach typu
Paweł - 13-08-2006 00:23
[MySQL] kolejność w ramach typu
Mam w tabeli rekordy. Jest kolumna typ. Każdy rekord ma jako "typ" liczbę od 1 do 10. Rekordy można wyświetlać na www wybierając tylko typ 1, tylko typ 2, itd. Ale kolejność wyświetlania w ramach każdego typu (1..10) jest - na razie - raczej stała. W tej tabeli jest (ma być - liczę na pomoc) też kolumna kolejność.
Chodzi mi o to, aby można było - w ramach każdego typu - wyświetlać rekordy w kolejności - WHERE typ = 3 ORDER by kolejność
W jaki sposób (jakiego zapytania użyć) wpisać przypadkowe liczby do "kolejność". Tzn. np. w tabeli jest 200 rekordów gdzie typ = 3. I te 200 rekordów musi dostać wpisy do kolumny "kolejność" - przypadkowe liczby od 1 do 200. Te liczby nie powinny się powtarzać, tzn. każdy rekord (typ = 3) powinien dostać inną liczbę z zakresu 1..200, której nie ma żaden inny rekord typ = 3.
Chcę, aby ta czynność była automatycznie wykonywana co kilka dni, po każdej takiej generacji kolejność wyświetlania rekordów powinna być inna.
Dziękuję. Paweł
Artur Gancarz - 13-08-2006 00:23
Użytkownik Paweł napisał: > Mam w tabeli rekordy. Jest kolumna typ. Każdy rekord ma jako "typ" > liczbę od 1 do 10. > Rekordy można wyświetlać na www wybierając tylko typ 1, tylko typ 2, itd. > Ale kolejność wyświetlania w ramach każdego typu (1..10) jest - na razie > - raczej stała. > W tej tabeli jest (ma być - liczę na pomoc) też kolumna kolejność. > > Chodzi mi o to, aby można było - w ramach każdego typu - wyświetlać > rekordy w kolejności - WHERE typ = 3 ORDER by kolejność > > W jaki sposób (jakiego zapytania użyć) wpisać przypadkowe liczby do > "kolejność". > Tzn. np. w tabeli jest 200 rekordów gdzie typ = 3. > I te 200 rekordów musi dostać wpisy do kolumny "kolejność" - przypadkowe > liczby od 1 do 200. Te liczby nie powinny się powtarzać, tzn. każdy > rekord (typ = 3) powinien dostać inną liczbę z zakresu 1..200, której > nie ma żaden inny rekord typ = 3. > > Chcę, aby ta czynność była automatycznie wykonywana co kilka dni, po > każdej takiej generacji kolejność wyświetlania rekordów powinna być inna. > > Dziękuję. Paweł
Witaj, jeśli ci bardzo nie zależy na "niepowtarzalności" a jedynie na zmianie kolejności okresowo, to możesz dopuścić, że liczby będą się powtarzały, nie prawdaż? Co najwyżej za kilka dni będą się powtarzać liczby w innych rekordach. To wystarcza, aby co kilka dni "układ/kolejność" się zmieniały (zakładam, że każdy z rekordów posiada również swój numer identyfikacyjny, który nie będzie się zmieniał). Wtedy jednym zapytaniem "generujesz" numerki:
update tabela set kolejnosc=rand();
rand() to funkcja losowa z liczbami od 0 do 1 z dokładnością do kilkunastu miejsc po przecinku. Wystarczy że kolumna "kolejność" będzie liczbą rzeczywistą i kolejność gotowa. Przy naprawdę nieszczęśliwym zbiegu okoliczności będziesz miał wygenerowanych kilka takich samych liczb, ale przecież chodzi o zmianę kolejności co kilka dni, a nie o "unikalność" tego pola (w moim rozumieniu nie musi być unikalne do tego celu).
pozdrawiam Artur
ktostam - 16-08-2006 01:26
Paweł napisał(a): > Mam w tabeli rekordy. Jest kolumna typ. Każdy rekord ma jako "typ" > liczbę od 1 do 10. > Rekordy można wyświetlać na www wybierając tylko typ 1, tylko typ 2, itd. > Ale kolejność wyświetlania w ramach każdego typu (1..10) jest -na razie > - raczej stała. > W tej tabeli jest (ma być - liczę na pomoc) też kolumna kolejność. > > Chodzi mi o to, aby można było - w ramach każdego typu - wyświetlać > rekordy w kolejności - WHERE typ = 3 ORDER by kolejność > > W jaki sposób (jakiego zapytania użyć) wpisać przypadkowe liczby do > "kolejność". > Tzn. np. w tabeli jest 200 rekordów gdzie typ = 3. > I te 200 rekordów musi dostać wpisy do kolumny "kolejność" - przypadkowe > liczby od 1 do 200. Te liczby nie powinny się powtarzać, tzn. każdy > rekord (typ = 3) powinien dostać inną liczbę z zakresu 1..200, której > nie ma żaden inny rekord typ = 3. > > Chcę, aby ta czynność była automatycznie wykonywana co kilka dni, po > każdej takiej generacji kolejność wyświetlania rekordów powinna być inna.
skoro ma byc to robione raz na kilka dni, nie trzeba specjalnie glowic sie wydajnoscia. proponuje w zapytaniu pobrac wszystkie rekordy z tabeli w kolejnosci losowej, a nastepnie w php lub innym srodowsiku, odczytywac je w petli, na podstawie kolejnych wartosci typ zwiekszac odpowiednie liczniki w tablicy zawierajacej wszystkie mozliwe wartosci pola typ. nastepnie wykonac zapytanie aktualizujace dany rekord i nadajac mu kolejnosc taka jak przed chwila co zwiekszony indeks danego typu. i powtarzamy petle da kolejnych rekordow. proste, skuteczne... :)
pozdrawiam
Paweł - 16-08-2006 01:26
> update tabela set kolejnosc=rand();
Dziękuję za odpowiedź. Utworzyłem kolumnę kolejność typu mediumint a zapytanie dałem takie: update tabela set kolejnosc=rand() * 8388600; Działa bardzo dobrze.
Co do powtarzania - tak, może się powtarzać, dobrze by było tylko, żeby MySQL zapytany o wszystkie rekordy zwracał je (jeśli będą np. 3 rekordy z "kolejność" = np. 10) w tej samej kolejności przy kolejnych odsłonach. Chodzi tutaj o Googlebota.
Paweł - 16-08-2006 01:27
Dziękuję za odpowiedź.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
[MySQL] Czy da =?ISO-8859-2?Q?si=EA_wykonac_takie_powi=B1z?==?ISO-8859-2?Q?anie_mi=EAdzy_tabelami=2C_i_jak_to_odpyta=E6_? ==?ISO-8859-2?Q?=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plnawschodzie.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|