Skocz do zawartości

[zabawa] Problem do rozwiązania.


krupek

Rekomendowane odpowiedzi

Twoje rozwiązanie nie umożliwia wyciągnięcia duplikatów to 1)

Zdefiniuj dokładnie, co ma zostać zwrócone. Bo najpierw piszesz

o powtórzeniu losowania, a potem o duplikatach.

Zapytanie ma wyciągać tylko duplikaty - a może tylko duplikaty

i uzupełniać do 1000 rekordów - uściślij proszę :D

2) w niektórych przypadkach nie zwróci 1000 rekordów.

Przy skali 10^3 rekordów z bazy 10^6 prawdopodobieństwo trafienia

w ostatnie 1000 rekordów w bazie jest znikome. Przypominam założenia zadania:

Mamy tabelę, która ma 1,000,000 rekordów

(...)

Należy wybrać (...) 1,000 losowych rekordów z możliwością powtórki.

Więc napisz dokładnie, co ma się dziać, bo uważam że pierwotne założenia

moje zapytanie spełnia ;)

pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 49
  • Dodano
  • Ostatniej odpowiedzi

@oscid: zapytanie ZAWSZE musi zwracać poprawny wynik... wyobraź sobie system bankowy...

akurat trafiłeś totka i przelewają Ci $ na konto, a w banku ZONK przelaliśmy Panu kasę ale nasz system 10^-8 ma problem z transakcją i $ nie można odzyskać ;)

Zapytanie ma zwracać 1000 rekordów.

Co byś zrobił gdyby maszyna testująca sprawdzałaby tak długo wydajność aż trafi na wynik zawierający dwa takie same rekordy?

Zadanie pomocnicze spróbuj na tabeli 1000 rekordów wyciągnąć 2000 losowych wyników.

pozdro 600

:D

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli ktoś robi tabelę i ona nie ma klucza głównego to taka tabela jest do D..Y

Proponuję przeczytanie jakiejś ksiązki o bazach danych.

Bo wystarczy dodać klucz i po zabawie problem robi się banalny

najprostsze rozwiązanie:

1)Dodać do tabeli kolumne

KLUCZ INTEGER NOT NULL PRIMARY KEY

W kolumnie tej maja być wartości 1-1000000

2)

w PHP generujemy strinng z kluczami jakie wybieramy z bazy

np.

for($i=0;$i<1000;$i++)

{

$klucze.= ",'. rand(100000);

}

$klucze[0] := ' ' ; // wycinam pierwszy przecinek

/// wygeneruj sie nam lista: 1233,12312,234234,23423,123123,34534,345345,345345,345345.....

3)

i potem SQL

select * from TABELA where KLUCZ in ( $klucze );

KONIEC

Nalezy jeszcze sprawdzić czy w MYSQL wydajniejsze jest

SELECT

FROM

WHERE KLUCZ = 234234 OR KLUCZ = 534234 OR KLUCZ = 34534 ....

SELECT

FROM

WHERE KLUCZ IN (234234, 534234, 34534 .... )

Bo nie jestem pewny jak optymalizator sie zachowa dla dużej ilości wierszy

najlepiej sprawdzić doświadczalnie

Jezeli w tabeli naprawde nie można dodac kolumny to trzeba wykorzystać kolumny systemowe (o ile baza posiada coś takiego)

I kolejna sprawa dla mnie rekord oznacza jeden wiersz

Odnośnik do komentarza
Udostępnij na innych stronach

@Maximus-Rex: zadanie jest jasno zdefiniowane - na tym polega cała zabawa.

a co do 3) to jest tam błąd

bo co jeżeli będzie select * from tabela where klucz in (1, 2, 1, 2, 1, 2) ile zwróci rekordów?

u mnie na dużej tablicy liczy się jakieś ~2min 30sec,

na małej standardowo ~0,00 sec.

pozdro 600

:D

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

to mozna inaczej

for($i=0;$i<999;$i++)

{

$RAND= rand(1000);

$sql.= 'SELECT $RAND UNION ';

}

i następnie trzeba LEFT JOIN zrobić dla tabeli która zaostała wygenerowana z UNION z naszą tabelą

Wtedy bedzie już ilośc wierszy OK i bedą powtórzenia

To jak nie można dodac kolumny to chodziać indeks na pierwszej kolumnie aby było szybciej

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra przylacze sie do zabawy ale pytanie:

1 mały plik nie działa pobieranie - nie wiem czy tylko mi.

2 pytanie skoro zadaniem jest tylko i wyłącznie wybranie losowo 1000 rekordow które mają sie powtórzyć.

To liczy się wydajność czy użycie. Chyba lepiej jak coś jest szybkie nawet jak kosztem 2 zapytań.

pytanie 3 - struktura tabeli. Czy mozna uzyc np. innych niż MyISAM.

Bo celem jest wybranie 1000 losowych z powtorzeniem, to czy w tabeli musi byc ta sama ilosc pol.

Tzn czy moge zrobic pole a,pole B, itp :D. Mam nadzieje ze dobrze to opisałem.

bo nie doczytalem o strukturze bazy - czy jest juz dowolna.

Bo ja albo nie wykumal o co chodzi albo nie wiem :) ktore zalozenia sa wazniejsze.

Wyciagnac tysiac rekordow z powtorzeniami czy musze odwolywac sie do wszystkich pol ? czemu nie losowych ? czemu nie tylko np. 2 tylko 100 :) a moze losowo do 2 ze 100.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności