Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Losowe wartości MySQL
Forum PHP.pl > Forum > Przedszkole
Robert1985
  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.
sada
Może DISTINCT Id
Robert1985
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.  
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.