Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Losowe wartości MySQL
Robert1985
post
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

Ostrzeżenie: (0%)
-----


  1. #Napisać procedure, która z tablicy Customers pobierze n losowo wybranych klientów.
  2. #(Uwaga! Mozna skorzystać z tabel pomocniczych)
  3. delimiter //
  4. CREATE procedure los_klient(IN n int)
  5. begin
  6. CREATE TABLE los LIKE customers;
  7. while n > 0 do
  8. REPLACE INTO los (SELECT * FROM customers ORDER BY rand() LIMIT 1);
  9. SET n = n - 1;
  10. end while;
  11.  
  12. SELECT * FROM los;
  13. DROP TABLE los;
  14. end //
  15. delimiter ;


Problem jest taki ,że jeżeli klucz główny z tabeli Customers się powtórzy to chciałbym ,aby funkcjia i tak wypisała mi podaną liczbę klientów. A dzieje się inaczej zarówno w ten sposób jak również próbowałem używając INSERT IGNORE ten rekord ,który jest pomijany jest zliczany i w zwrocie dostaję de facto jeden mniej niż powinienem ,kombinuję z tym już jakiś czas i nie wiem jak to wykonać. Chcialbym poprostu ,aby jeżeli INSERTnatrafi na powtarzający się klucz zignorował to ,ale ,aby w zamian wyszukał jeszcze jeden tak ,aby liczba zwrotów się zgadzała.


--------------------
"Istnieją dwa sposoby projektowania oprogramowania. Można napisać je tak prosto, że w oczywisty sposób nie będzie w nim niedoskonałości; można też uczynić je tak skomplikowanym ,że nie będzie w nim żadnych oczywistych niedociągnięć.Pierwsza metoda jest znacznie trudniejsza." C.A.R Hoare
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
sada
post
Post #2





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

Ostrzeżenie: (0%)
-----


Może DISTINCT Id
Go to the top of the page
+Quote Post
Robert1985
post
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Nie należało użyć innego warunku, ale dzięki za dobre chęci Sada DISTINCT działa raczej na wynikach ,a nie podczas insertu. A rozwiązanie jest poniżej jakby komuś trafiło się podobne zadanie do rozwiązania:
  1. delimiter //
  2. CREATE procedure los_klient(IN podana_ilosc int)
  3. begin
  4. declare faktyczna_ilosc int DEFAULT 0;
  5.  
  6.  
  7. CREATE TABLE los LIKE customers;
  8. while faktyczna_ilosc < podana_ilosc do
  9. INSERT IGNORE INTO los (SELECT * FROM customers ORDER BY rand() LIMIT 1);
  10. SET faktyczna_ilosc = (SELECT count(*) FROM los);
  11. end while;
  12.  
  13. SELECT * FROM los;
  14. DROP TABLE los;
  15. end //
  16. delimiter ;
  17.  


--------------------
"Istnieją dwa sposoby projektowania oprogramowania. Można napisać je tak prosto, że w oczywisty sposób nie będzie w nim niedoskonałości; można też uczynić je tak skomplikowanym ,że nie będzie w nim żadnych oczywistych niedociągnięć.Pierwsza metoda jest znacznie trudniejsza." C.A.R Hoare
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 23:17