Xart
24.04.2014, 15:10:43
Witam piszę sobie dla nauki pewne skrypty ostatnio i jak czegoś nie wiem to pytam

Mam do was prośbę abyście odesłali mnie do jakiś źródeł jak zrobić pewien system ("losowania/przydzielania")
Dokładniej
Mam w bazie danych tabele zawodnicy
// id // imie i nazwisko // klub //
i np:
1 // Wacał Markowski // Wojownik Elbląg
itd...
Załóżmy, że mam 16 zawodników i skrypt ma losowo dobrać ich w prawy, z tym że musza być z innego klubu i to jest pierwsza runda. Potem skrypt z pozostałych 8 losuje między sobą z tym że jeżeli istnieje taka możliwość muszą być z różnych klubów i tak dalej aż do półfinału...
Jakich funkcji użyć ?
Może jakieś podpowiedzi / części kodu ?
Może link do manuala
Będę wdzięczny za każdą pomoc
nospor
24.04.2014, 15:14:40
Losujesz pierwszego, potem dla niego szukasz drugiego z innego klubu.
Potem losujesz znowu jednego i dla niego drugiego z innego klubu.
itd
Gdy w danym losowaniu nie bedzie kolesia z innnego klubu, to wowczas losujesz z jego klubu
Xart
24.04.2014, 15:17:29
@UP
Dzięki za podpowiedź takie rozwiązanie jest dobre bo czy będę miał 30 czy 10 to się sprawdzi
Oczywiście jeżeli liczba jest nie parzysta to przechodzi bez walki itd.
I to sobię zrobie na if'ach ale jakiej funkcji użyć do losowania ?
Byłbym wdzięczny bardzo za jakieś przykładowe kawałki kodu
nospor
24.04.2014, 15:18:53
jesli robic bedziesz w bazie to
...order by rand()
Przy tak malej liczbie rekordow jest to wystarczajace rozwiązanie
Xart
24.04.2014, 15:21:20
@UP
Wolałbym zrobić to jednak na innej zasadzie.
Pobieram dane z bazy do tablicy.
Wybieram pierwszego zawodnika z listy i losuję do niego z innym klubem -> Jak to napisać ?
nospor
24.04.2014, 15:22:42
Co ty z tym UPem? Przeciez wiem ze z dolem nie gadasz...
W bazie mozesz zrobic warunki w zapytaniu. Robiąc to na tablicy w php bedziesz musial latac i sprawdzac wszystko pokolei
Xart
24.04.2014, 15:24:53
A mógłbyś podać jakiś konkretny przykład bo właśnie ja widzę tylko taką moetodę po kolei...
nospor
24.04.2014, 15:26:07
Nie bardzo rozumiem w czym problem. Napisalem ci krok po kroku co masz robic. Podalem ci jak sie losuje w mysql. Jaki masz konkretnie problem?
Xart
24.04.2014, 15:29:06
Podałeś mi tylko metodę sortowania wyników z bazy danych...
order by rand()
i to rozumiem ale do tego warunku nie da się dopisać że nie mogę być z 1 drużyny...
nospor
24.04.2014, 15:30:30
No juz takie podstawy jak
....WHERE ID_DRUZYNY<>ID_DRuZYNY_KOLESIA_DLA_KTOREGO_SZUKASZ
juz sobie darowalem. Sadzilem ze umiesz korzystac z WHERE w zapytaniach...
Xart
24.04.2014, 15:33:00
Ale takim sposobem dla każdego kolesia muszę szukać odzielnie... a ja nie będę miał stałej liczby tylko np będę musiał dopisać 10 zawodników to 10 będę musiał dorobić 10 zapytań ...
Nie ma jakiegoś innego sposobu >
nospor
24.04.2014, 15:35:22
Cytat
Ale takim sposobem dla każdego kolesia muszę szukać odzielnie
No tak. Dokladnie to wynikalo z psedokodu jaki ci podalem.
Xart
24.04.2014, 16:21:56
Mógłby ktoś napisać mi jakiś przykład w PHP ?
Próbowałem to zrobić ale coś mi nie wyszło...

<table>
<?php
include('inc/config.php');
$zapytanie = $mysqli->query("SELECT * FROM `zawodnicy` order by id");
$wynik = $zapytanie->fetch_assoc();
for ($i=1; $i>=8; $i=$i+2;){
$zapytanie1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` = '$i'");
$wynik1 = $zapytanie1->fetch_assoc();
$druzyna = $wynik1['druzyna'];
$zapytanie2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` = '$i++' AND `druzyna` != '$druzyna'");
$wynik2 = $zapytanie2->fetch_assoc();
echo $wynik1['nazwa'] $wynik2['nazwa']; }
?>
</table>
Niestety nie działa i chyba nie za bardzo ma prawo działać...
Turson
24.04.2014, 16:33:36
$zapytanie = $mysqli->query("SELECT * FROM `zawodnicy` order by id");
$wynik = $zapytanie->fetch_assoc();
for ($i=1; $i>=8; $i=$i+2;){
$zapytanie1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` = '$i'");
Po co pobrałeś rekordy jeśli z nich nie korzystasz :/
$result1 = pobierz wszystkich zawodnikow
foreach($result1 as $v){
$result2 = pobierz zawodnika gdzie drużyna!=$v[druzyna]
para: $v[imie] $result2[imie]
}
Xart
24.04.2014, 16:42:12
Dzięki wielkie ale coś nadal mi nie działa....
<?php
include('inc/config.php');
$result1 = $mysqli->query("SELECT * FROM `zawodnicy` ORDER BY id");
foreach($result1 as $v){
$result2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `druzyna` != $v['druzyna']");
echo("."$v['nazwa']." vs ."$result2['nazwa'].""); }
?>
Turson
24.04.2014, 16:43:09
gdzie jest fetch_assoc? a w drugim fetch row
Xart
24.04.2014, 17:56:40
Fakt ...
Poprawiłem i wyświetla ale nie tak jak chce ;/
<?php
include('inc/config.php');
$result1 = $mysqli->query("SELECT * FROM `zawodnicy` order by id");
foreach($result1 as $v){
$i = $v['druzyna'];
$result2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `druzyna` != '$i' ");
$wynik2 = $result2->fetch_assoc();
}
?>
Ĺukasz vs RafaĹ
RafaĹ vs Ĺukasz
Dominik vs RafaĹ
Kuba vs Ĺukasz
Diana vs RafaĹ
Krystian vs Ĺukasz
Marian vs Ĺukasz
Szuh vs RafaĹ
Każdy zawodnik może walczyć z każdym tylko jeden raz i ma to być dobrane losowo a nie wszystkie kombinacje
Czyli jak masz np 8 zawodników to powinny wylosować się 4 walki
np numery
1-4
5-8
2-3
6-7
albo
1-3
2-4
5-7
6-8
ITP a nie tutaj każdy walczy z każdy...
;/
Oczywiście ma to być poprostu losowanie...
Dowolnie ma wylosować zawodników do siebie i tyle aby nie byli w tej samej drużynie chyba że nie ma innej możliwości
nospor
24.04.2014, 17:58:32
Napisalem ci jak to zrobic.Czemu nie zrobisz jak napisalem?
Xart
24.04.2014, 18:19:36
Bo nie rozumiem tego co napisałeś - jak ty byś chciał to sprawdzać i kompletnie nie wiem jak zacząć. Mógłbyś mi to opisać krok po kroku z fragmentami kodu ? Byłbym bardzo wdzieczny nie zalezy mi zbytnio na czasie ale analizujac ten kod bym sie nauczył. Sory za błędy - tele
nospor
24.04.2014, 18:26:21
Masz napisane:
"Losujesz pierwszego, potem dla niego szukasz drugiego z innego klubu."
Czego tu nie rozumiesz?
Masz napisac zapytanie, ktore wylosuje ci jednego uzytkownika. Potem masz napisac zapytanie, ktore wylosuje tez jednego uzytkownika, ale z innego klubu.
Wszelkie niezbedne informacje jak to sie robi napisalem ci.
Operacje te powtarzasz tyle razy ile razy cchesz miec par.
Oczywiscie w kazdym zapytaniu musi sie znalezc warunek, by nie losowal wylosowanych juz userow. Ale to jest proste, bo wylosowanych userow bedziesz zapisywal w tablicy php a potem do kazdego zapytania przekazywal ID wylosowanych userow by nie bral ich pod uwage
Xart
24.04.2014, 18:29:53
Tak tylko dla mnie nie jest to takie proste :/ moglbys mi takie cos napisac ?
nospor
24.04.2014, 18:41:23
zapytanie losujace uzytkownia ci podalem
zapytanie losujace uzytkownika z innnej grupy tez ci podalem
W tej chwili masz poprostu lenia. Dopoki sie go nie pozbedziesz, nie licz na pomoc.
Xart
24.04.2014, 18:43:28
... ze co ? Ja nie mam lenia

podaj mi jeszcze raz te zapytania bo jakos nie widze...
nospor
24.04.2014, 18:44:48
...order by rand() limit 1
.......WHERE ID_DRUZYNY<>ID_DRuZYNY_KOLESIA_DLA_KTOREGO_SZUKASZ ....
Xart
24.04.2014, 18:52:19
Powiedz mi jeszcze czy da sie to zrobic jakos petlą zeby skrypt dzialal dobrze niezaleznie od liczby rekordow. Jak zapisac wylosowane id do tablicy i jak sprawdzic czy to id w tablicy juz jest.
nospor
24.04.2014, 18:55:17
PObierasz liczbe rekordow, dzielisz przez dwa i masz liczbe par
Jak zapisac w php cos do tablicy? Odnosze wrazenie ze ty sie cofasz, zamiast isc do przodu.... zajrzyj do manuala, tam takie podstawy są podane
Xart
25.04.2014, 06:31:49
Bo dawno nic nie pisałem i może dlatego... jak bede po 21 na kompie sproboje to zrobic.
Witam... napisałem na razie takie coś i odrazu pytam czy to zadziała na takiej zasadzie jak chce to po 1.
Po 2 nie wiem jak w zapytaniu SQL sprawdzić że id nie ma w tablicy
Po wykonaniu zapytań muszę do tej tablicy zapisać zmienne $uzyteid1 i $uzyteid2
Co wy na to ?
<?php
include('inc/config.php');
$ilosc = 4; //ILOŚĆ PRAR
for($i=1; $i>=$ilosc; $i++;){
$spr1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` <> 'TABLICA' ORDER BY rand() LIMIT 1");
$wynik1 = $spr1->fetch_assoc();
$druzyna1 = $wynik1['druzyna'];
$nazwa1 = $wynik1['nazwa'];
$uzyteid1 = $wynik1['id'];
$spr2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` <> 'TABLICA' AND `druzyna` <> '$druzyna1' ORDER BY rand() LIMIT 1");
$wynik2 = $spr2->fetch_assoc();
$nazwa2 = $wynik2['nazwa'];
$uzyteid2 = $wynik2['id'];
}
?>
Nie wiem, nie mam już pomysłów próbowałem to robić różnymi sposobami nawet tablice sortować czyli
<?php
$wszyscy = mysql_query("SELECT * FROM zawodnicy ORDER BY druzyna"); foreach ($wszyscy as $k=>$v){
$sortowane[$v['druzyna' ]][] = $v;
}
?>
Nie wiem, nie mam pojęcia jak to ugryźć byłbym wdzięczny, gdyby ktoś zechciał mi ten skrypt napisać...
Pozdrawiam
nospor
25.04.2014, 08:14:43
include('inc/config.php');
$ilosc = 4; //ILOŚĆ PRAR
for($i=1; $i>=$ilosc; $i++;){
$spr1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` not in (".implode(',',$bylo).") ORDER BY rand() LIMIT 1"); $wynik1 = $spr1->fetch_assoc();
$druzyna1 = $wynik1['druzyna'];
$bylo[]=$wynik1['id']; //BYLO
$nazwa1 = $wynik1['nazwa'];
$uzyteid1 = $wynik1['id'];
$spr2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `id` not in (".implode(',',$bylo).") AND `druzyna` <> '$druzyna1' ORDER BY rand() LIMIT 1"); $wynik2 = $spr2->fetch_assoc();
$nazwa2 = $wynik2['nazwa'];
$bylo[]=$wynik2['id']; //BYLO
$uzyteid2 = $wynik2['id'];
}
Xart
25.04.2014, 15:22:45
Dzięki wielkie ale rozwiazałem to w trochę inny sposób

Można zamknąć:
Mój KOD
<?php
include('inc/config.php');
for($i = 1; $i <= 4; $i++){
$spr1 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `status` = '0' ORDER BY rand() LIMIT 1");
$wynik1 = $spr1->fetch_assoc();
$id1= $wynik1['id'];
$mysqli->query("UPDATE `zawodnicy` SET status='1' WHERE id='$id1'");
$druzyna1 = $wynik1['druzyna'];
$nazwa1 = $wynik1['nazwa'];
$spr2 = $mysqli->query("SELECT * FROM `zawodnicy` WHERE `status` = '0' AND `druzyna` != '$druzyna1' ORDER BY rand() LIMIT 1");
$wynik2 = $spr2->fetch_assoc();
$id2 = $wynik2['id'];
$mysqli->query("UPDATE `zawodnicy` SET status='1' WHERE id='$id2'");
$nazwa2 = $wynik2['nazwa'];
}
?>
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.