Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]grupowanie wyników z innymi nazwami
Forum PHP.pl > Forum > Przedszkole
Wilwarin
Witam.
Mam tabelę przechowującą rekordy w formacie

name1 | number1 | number2 | name2

i chciałem zrobić skrypt który grupuje linijki z takimi samymi rekordami w ten sposób:

qwe | 12 | 5 | asd
asd | 5 | 12 | qwe

tak żeby łączyć takie same wyniki przesyłane przez userów tak, żeby się zgadzały (przesyłający to zawsze 1), a linijki bez pary wyświetlać osobno/w innym kolorze.

Bardzo proszę o pomoc. Dam pomógł każdemu, kto się przyczyni do chociaż małego postępu smile.gif
jaslanin
1. Chyba nie rozumiesz co to znaczy zwrot: "grupuje linijki z takimi samymi rekordami".

a. "linijka, wiersz, rekord" - w tabeli bazy danych można uznać za synonimy, czyli piszesz że: "grupuje rekordy z takimi samymi rekordami"
b. "grupowanie oznacza" redukcję redukcję lub brak zmiany liczby rekordów, która przebiega na podstawie jakiegoś wzorca.
c. "z takimi samymi", rekord taki sam jak inny rekord to taki który ma takie same wartości w takiej samej kolejności.

Konfrontując to z przykładem danych wynikowych który podajesz:

qwe | 12 | 5 | asd
asd | 5 | 12 | qwe

Pierwszy problem jaki widzę to nie widzę tu jednakowych rekordów. Bowiem jednakowe rekordy wyglądały by tak:

qwe | 12 | 5 | asd
qwe | 12 | 5 | asd

Więc coś tuta już się nie zgadza.
_________________________

Dalej:

"tak żeby łączyć takie same wyniki przesyłane przez userów tak, żeby się zgadzały"

1. Co rozumiesz przez takie same wyniki? Czyli jakie warunki muszą spełniać wyniki by były takie same?
2. Co rozumiesz przez "tak żeby się zgadzały"? Czyli jakie warunki muszą spełniać żeby się zgadzały?
________________

"(przesyłający to zawsze 1)"

Czyli name1 number1 to przesyłający, a name2 number2 to odbierający? Dlaczego więc nie nazwiesz tych pul jakoś bardziej sensownie, by od razu po nazwie można było zrozumieć o co chodzi np.

senderId, senderName, recipientId, recipientName
_________________

Podsumowując nie wiadomo o co Ci chodzi. Już lepiej jakbyś zamiast używania pojęć których chyba do końca nie rozumiesz szczegółowo opisał co chcesz osiągnąć. Wydaje mi się że robisz jakiś system przesyłania czegoś i chcesz sobie zrobić tabelę gdzie te wszystkie transfery czegoś mógłbyś sobie zobaczyć. Ale sposób prezentacji danych po tym co napisałeś nie jest do końca jasny. Musisz się dokładnie zastanowić w jakiej kolejności mają być wyświetlane te transfery, jakie dane mają się tam ukazywać. Jeżeli dalej chcesz uzyskać pomoc, postaraj się napisać zrozumiale o co Ci chodzi.
Wilwarin
Sorry za to, że napisałem tak skomplikowanie, ale pisałem tak na chłopski rozum.
A więc chodzi o to, że 2 userów wysyła wyniki formularzem

nick 0:0 nick

i zapisuje to do tabeli

name1 | wynik1 | wynik2 | name2

jeśli, na przykład, user1 grał z userem2 i wynik to 4:2 to wysyłają wyniki do bazy danych:

user1: user1 | 4 | 2 | user2
user2: user2 | 2 | 4 | user1

i powiedzmy że grało 10 osób, każdy z każdym, i chcę żeby mnie, jako adminowi, wyświetlały się te wyniki w parach, jeżeli się zgadzają, a jeśli ktoś wprowadził błędny wynik, bądź nie ma pary, to żeby się to wyświetlało osobno (mam nadzieję, że nie namieszałem)

Da się parować w ten sposób?
jaslanin
Mi się wydaje że każdy mecz powinien być zapisywany w jednym rekordzie, a nie w dwóch tylko z "odwrotnych stron".

Innym sposobem jest utworzenie dodatkowych kolumn których można by używać w klauzuli order by:
1. Utworzenie kolumny meczId w której byłby unikalny identyfikator meczu który miałyby oba rekordy meczu. I sortowanie po nim.
2. Np jeżeli user1, user2 są unikalnymi nieujemnymi identyfikatorami użytkowników można by było zrobić dwa dodatkowe pola maxUser, miUser i wstawić w te pola odpowiednio maksymalny i minimalny identyfikator. Potem sortowanie po tych polach.

Ale to tylko są takie przypuszczalne rozwiązania. Bo żeby coś w tym przypadku pomóc trzeba więcej informacji o projekcie bazy danych i jakie role ma spełniać. W każdym razie dobrze żebyś zapoznał się z zasadami normalizacji bazy danych jeżeli jeszcze tego nie zrobiłeś.
Wilwarin
chodzi o to, że nie mam jak sprawdzić wyników userów, i jeśli ktoś skłamie, żebym widział, że rekordy się nie zgadzają, i że jest błąd. Potem mogę ręcznie już poprawne wyniki wprowadzać tongue.gif Z tym unique ID mi podsunąłeś pomysł, żeby mecz składał się z ID userów razem, przedzielone myślnikiem. Mniejszy nr zawsze będzie mniejszy, i wtedy nie będzie problemów biggrin.gif Jak będę miał czas, to to napiszę. Dzięki za pomysł smile.gif

ok, teraz nie wiem jak parować rzędy z bazy MySQL wg 1 kolumny... pomoże ktoś?

A więc chodzi o to, że w tabeli są wyniki w formie

name1 | wynik1 | wynik2 | name2 | uniqueID
qwe | 12 | 5 | asd | 1337
asd | 5 | 12 | qwe | 1337

i chciałbym, żeby rzędy parowały się względem uniqueID, a potem porównywały wyniki. Jeśli tak się nie da, to po prostu zrobię, żeby name 1 był zawsze wybierany alfabetycznie, wtedy będzie o wiele łatwiej. Jakoś na razie nie mam pomysłów jak to zrobić, ale posiedzę nad tym i pokombinuję. No, chyba, że ktoś wpadnie na lepszy pomysł, to byłbym wdzięczny.

@edit

Ok, dałem sobie radę, ale jest jeden mały problem.

zrobiłem MySQL query
  1. "SELECT sum(faw_score1) as total1, sum(faw_score2) as total2 FROM wyniki WHERE faw_uniqueid='".$x[faw_uniqueid]."'";


i teraz porównuję total1 do total2. Wygląda to tak:

name1 | wynik1 | wynik2 | name2 | uniqueID
qwe | 12 | 5 | asd | 1337
asd | 5 | 12 | qwe | 1337
---------------------------------------------------------
total1=17 total2=17

wszystko działa idealnie, dopóki nie będzie wyników w ten sposób:

name1 | wynik1 | wynik2 | name2 | uniqueID
qwe | 12 | 5 | asd | 1337
asd | 6 | 13 | qwe | 1337
---------------------------------------------------------
total1=18 total2=18

I nie wiem co na to poradzić. Jest jakiś inny na to sposób? Albo czy się da jakoś to poprawić?

@odświeżam
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.