Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Najwiekszy iloczyn i segregacja
Forum PHP.pl > Forum > Bazy danych > MySQL
inwob
Witam!

Mam dość spory problem którego nie potrafię sam rozwiązać :\
Posiadam 2 następujący tabele, 1 - logowanie, 2 - typy

Najważniejsze z tych tabel będą dane uzytkownik, kurs, stawka oraz siadl. Te 4 na pewno będą potrzebne aby rozwiązać mój problem.
Chce utworzyć prostą tabelkę na stronie w ktorej bedzie od najwiekszego na najmniejszego zysku jaki przyniósł uzytkownik.
(tabelka po srodku)


Myślałem o takim czymś
  1. $uzytkownicy=mysql_query("select * FROM uzytkownicy ORDER BY `uzytkownicy`.`id` ASC");
  2. while ($tab1 = mysql_fetch_assoc($uzytkownicy) {
  3. $typy=mysql_query("select * FROM typy WHERE `uzytkownik` = '".$tab1[uzytkownik]."' ORDER BY `typy`.`uzytkownik` ASC");
  4. while ($tab2 = mysql_fetch_assoc($typy){
  5. if($tab2[siadl] == "1"){
  6. $bilans=(($tab2[kurs]*$tab2[stawka])-$tab2[stawka]);
  7. $zyskkk=$zyskk;
  8. $zyskk=$zyskkk+$bilans;
  9. } else {
  10. $bilans=(-$sysk[stawka]);
  11. $zyskkk=$zyskk;
  12. $zyskk=$zyskkk+$bilans;
  13. }
  14. echo ('<tr><td>'.$tab1[uzytkownik].' +'.$zyskk.'');
  15. }
  16. }

Lecz to nie zdaje egzaminu.
Co powinienem zrobić?
Pozdrawiam!
Mchl
Wszystkie pola text? A później są narzekania, że MySQL jest mało wydajny... Z tej struktury nie wynika nawet jaka jest zależność między tymi tabelami.
inwob
Cytat(Mchl @ 2.05.2010, 21:49:19 ) *
Wszystkie pola text? A później są narzekania, że MySQL jest mało wydajny... Z tej struktury nie wynika nawet jaka jest zależność między tymi tabelami.


chwilowo tak potem normalnie będzie na int większośc
Mchl
Nadal nie wiemy jakie pole z tabeli typy jest kluczem obcym. Zakładam, że `uzytkownik`

Kod
SELECT
  l.uzytkownik,
  t.zysk
FROM
  logowanie AS l
INNER JOIN
  (SELECT uzytkownik, MAX(stawka * kurs) AS zysk FROM typy GROUP BY uztkownik) AS t
ON
  t.uzytkownik = l.id
ORDER BY
  t.zysk DESC
LIMIT 10

inwob
Cytat(Mchl @ 2.05.2010, 21:52:43 ) *
Nadal nie wiemy jakie pole z tabeli typy jest kluczem obcym. Zakładam, że `uzytkownik`

Kod
SELECT
  l.uzytkownik,
  t.zysk
FROM
  logowanie AS l
INNER JOIN
  (SELECT uzytkownik, MAX(stawka * kurs) AS zysk FROM typy GROUP BY uztkownik) AS t
ON
  t.uzytkownik = l.id
ORDER BY
  t.zysk DESC
LIMIT 10


Po twoim zapytaniu uzyskałem takie coś:
uzytkownik zysk
admin 4200
admin 1480
admin 390
admin 237
admin 130
admin 32

A ja chce coś takiego:
User1 2000
User3 1000
User2 200
User5 -100
User4 -2000
Mchl
Nie pomagam dalej, zanim nie pokażesz struktury tabel która nadaje się do pracy. Nadal nie powiedziałeś, jakie pole w tabeli typy jest kluczem obcym do tabeli logowanie. Zgadywałem, mogłem nie trafić, stąd takie efekty.
inwob
Cytat(Mchl @ 2.05.2010, 23:16:10 ) *
Nie pomagam dalej, zanim nie pokażesz struktury tabel która nadaje się do pracy. Nadal nie powiedziałeś, jakie pole w tabeli typy jest kluczem obcym do tabeli logowanie. Zgadywałem, mogłem nie trafić, stąd takie efekty.


Może podam ci przykłady z tych tabel.
Nie wiem o co ci chodzi z tym kluczem obcym bo na tym się jeszcze nie znam.
piotrooo89
to zrób takie same screen shoty tylko kliknij w zakładkę struktura.
inwob
Cytat(piotrooo89 @ 3.05.2010, 11:58:33 ) *
to zrób takie same screen shoty tylko kliknij w zakładkę struktura.


W 1 poście masz strukturę
Mchl
Z której wynika tylko tyle, że do niczego się nie nadaje.

Z tych screenów wynika, że zrobiłeś klucz obcy na kolumnie typy.uzytkownik która wskazuje na kolumnę logowanie.uzytkownik, co jest raczej marnym rozwiązaniem, ale może działać w taki sposób:

Kod
SELECT
  l.uzytkownik,
  t.zysk
FROM
  logowanie AS l
INNER JOIN
  (SELECT uzytkownik, MAX(stawka * kurs) AS zysk FROM typy GROUP BY uztkownik) AS t
ON
  t.uzytkownik = l.uzytkownik
ORDER BY
  t.zysk DESC
LIMIT 10
inwob
Cytat(Mchl @ 3.05.2010, 13:51:10 ) *
Z której wynika tylko tyle, że do niczego się nie nadaje.

Z tych screenów wynika, że zrobiłeś klucz obcy na kolumnie typy.uzytkownik która wskazuje na kolumnę logowanie.uzytkownik, co jest raczej marnym rozwiązaniem, ale może działać w taki sposób:

Kod
SELECT
  l.uzytkownik,
  t.zysk
FROM
  logowanie AS l
INNER JOIN
  (SELECT uzytkownik, MAX(stawka * kurs) AS zysk FROM typy GROUP BY uztkownik) AS t
ON
  t.uzytkownik = l.uzytkownik
ORDER BY
  t.zysk DESC
LIMIT 10


Niepotrzebnie korzystasz z kolumny zysk ponieważ ona jest tylko kolumną testową.
Załóż tak że `zysk` nie istnieje.
I jeżeli siadł > 1 to należy odjąć stawkę a jeżeli siadł = 1 należy zrobić (stawka * kurs) - stakwa a jeśli siadl = 0, ominąć
Mchl
Nigdzie nie korzystam z kolumny zysk. Odsyłam do kursu SQL.
inwob
Cytat(Mchl @ 3.05.2010, 14:19:45 ) *
Nigdzie nie korzystam z kolumny zysk. Odsyłam do kursu SQL.



Kod
AS zysk
Mchl
Ja mówiłem poważnie.
http://www.w3schools.com/SQL/sql_alias.asp
inwob
Cytat(Mchl @ 3.05.2010, 15:05:44 ) *


no dobra masz racje.
beda musial to jakos po swojemu zrobic bo nikt nie pomoze :\
Mchl
Jak nie pomożesz nam, to jak mamy pomóc Tobie? Od pierwszego postu mówię, żebyś najpierw doprowadził do porządku strukturę tabeli. Ale wolisz budować zamki na piaski. Powodzenia.
inwob
Nie znam się super na tym więc może powiesz jak?

Teraz mam tak
  1. $uzytkownicy=mysql_query("select * FROM logowanie ORDER BY `id` ASC");
  2. while ($tab1 = mysql_fetch_assoc($uzytkownicy)) {
  3. $typy=mysql_query("select * FROM typy WHERE `uzytkownik` = '".$tab1[uzytkownik]."' ORDER BY `typy`.`uzytkownik` ASC");
  4. while ($tab2 = mysql_fetch_assoc($typy)){
  5. if($tab2[siadl] == "1"){
  6. $bilans=(($tab2[kurs]*$tab2[stawka])-$tab2[stawka]);
  7. $zyskkk=$zyskk;
  8. $zyskk=$zyskkk+$bilans;
  9. } else {
  10. $bilans=(-$sysk[stawka]);
  11. $zyskkk=$zyskk;
  12. $zyskk=$zyskkk+$bilans;
  13. }
  14. mysql_query('UPDATE `uzytkownicy` SET '.$tab1[uzytkownik].' = "'.$zyskk.'" ');
  15. }
  16. }
  17. $oldet = "0";
  18. $wyniki=mysql_query("select * FROM logowanie WHERE `zysk` > \"1\" ORDER BY `logowanie`.`zysk` DESC ");
  19. if(@mysql_num_rows($wyniki)) {
  20. while($zyskowni = mysql_fetch_assoc($wyniki)) {
  21. if ($zyskowni[uzytkownik] != $oldet) {
  22. echo ('<a href="index.php?strona=serwis&serwis="'.$zyskowni[uzytkownik].'">'.$zyskowni[uzytkownik].' </a>(<font color="green">+'.$zyskowni[zysk].'</font>)');
  23. echo ('<center><img src="images/dots.jpg"></center>');
  24. }
  25. $oldet = $zyskowni[uzytkownik];
  26. }
  27. } else {
  28. echo ("error");
  29. }
Mchl
Ustaw właściwe typy danych dla kolumn. Tam gdzie liczba, niech będzie liczba, gdzie data - data, gdzie tekst nie dłuższy niż kilka tysięcy znaków - varchar.
Jako pole łączące obie tabele użyj ID użytkownika a nie jego nazwę.
inwob
wspólne kolumny to użytkownika, w tabeli typy, id jest numerem typu a nie numerem użytkownika

Mchl
Ale właśnie o to chodzi, żebyś w tabeli `typy` zamiast pola uzytkownik VARCHAR(50) miał uzytkownik_id INT. Zamiast wiązać przez napis, wiążesz przez ID, co jest pewniejsze i szybsze.

kurs: DECIMAL(5,2) albo DECIMAL(6,3), zależy jak dokładnie chcesz
email: INT?questionmark.gif to chyba jakaś pomyłka
IP: przechowujemy jako INT i korzystamy z funkcji INET_ATON() i INET_NTOA()
online, siadl: jak rozumiem wartość typu tak/nie, czyli typ TINYINT co najwyżej
haslo: CHAR(32), collation ASCII - hash zawsze ma stałą długość
kontakt,opis - czy na pewno aż text potrzebny?
inwob
Kontakt i opis mają parę linijek.
Poprawiłem jak mówiłeś.
Dodałem też kolumne `uzytkownik_id` po `uzytkownik` w `typy` i w `logowanie`
Mchl
W `logowanie` nie potrebujesz tej kolumny.

Spójrz.

tabela `logowanie`
id, uzytkownik, email... (inne dane)
---------------------------
1, admin, admin@typer.com
2, inwob, inwob@typer.com
3, mchl, mchl@irweasel.com

tabela `typy`
id, uzytkownik_id, typ, kurs ...
--------------------------------
1, 1, 1, 1.85
2, 1, X, 2.05
3, 2, 2, 1.90
4, 3, 1X, 1.55


Kolumna uzytkownik_id w tabeli `typy` mówi nam, do którego użytkownika należy dany typ. I tak, typy o id równym 1,2 należą do użytkownika 'admin, typ o id = 3 należy do użytkownika inwob, a typ z id = 4 należy do użytkownika 'mchl'.
Mówimy, że kolumna typy.uzytkownik_id jest kluczem obcym, bo wskazuje na klucz główny w innej tabeli.

Piszesz, że kontakt i opis mają po parę linijek. A ile mają znaków? To się liczy. TEXT to naprawdę spora armata, a w VARCHAR możesz zmieścić do 65000 znaków.
inwob
Cytat(Mchl @ 3.05.2010, 22:02:03 ) *
W `logowanie` nie potrebujesz tej kolumny.

Spójrz.

tabela `logowanie`
id, uzytkownik, email... (inne dane)
---------------------------
1, admin, admin@typer.com
2, inwob, inwob@typer.com
3, mchl, mchl@irweasel.com

tabela `typy`
id, uzytkownik_id, typ, kurs ...
--------------------------------
1, 1, 1, 1.85
2, 1, X, 2.05
3, 2, 2, 1.90
4, 3, 1X, 1.55


Kolumna uzytkownik_id w tabeli `typy` mówi nam, do którego użytkownika należy dany typ. I tak, typy o id równym 1,2 należą do użytkownika 'admin, typ o id = 3 należy do użytkownika inwob, a typ z id = 4 należy do użytkownika 'mchl'.
Mówimy, że kolumna typy.uzytkownik_id jest kluczem obcym, bo wskazuje na klucz główny w innej tabeli.

Piszesz, że kontakt i opis mają po parę linijek. A ile mają znaków? To się liczy. TEXT to naprawdę spora armata, a w VARCHAR możesz zmieścić do 65000 znaków.

nie usune uzytkownik z typy bo to duzo problemow mi narobi a przydaje sie w panelu admina zeby wyswietlac jaki uzytkownik dodal typ bez podrzeby odwolania do logowanie. To nie jest duza strona, max 250 uzytkownikow wiec wole zostawic text w opis i kontakt a wielkiej roznicy to chyba nie zrobi
Mchl
Zrobisz co zechcesz. Jakby co to ostrzegałem winksmiley.jpg
Przynajmniej nie używaj tego pola jako klucza obcego.
Zobacz że już w tych danych które wkleiłeś w jednej tabeli masz 'Typ-za-sms' a w drugiej 'typ-za-sms'.
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.