Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Najwiekszy iloczyn i segregacja
inwob
post 2.05.2010, 20:37:01
Post #1





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


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!

Ten post edytował inwob 2.05.2010, 20:37:29
Go to the top of the page
+Quote Post
Mchl
post 2.05.2010, 20:49:19
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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.
Go to the top of the page
+Quote Post
inwob
post 2.05.2010, 20:50:04
Post #3





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


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
Go to the top of the page
+Quote Post
Mchl
post 2.05.2010, 20:52:43
Post #4





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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

Go to the top of the page
+Quote Post
inwob
post 2.05.2010, 22:02:54
Post #5





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


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
Go to the top of the page
+Quote Post
Mchl
post 2.05.2010, 22:16:10
Post #6





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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.
Go to the top of the page
+Quote Post
inwob
post 3.05.2010, 10:50:23
Post #7





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


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.
Go to the top of the page
+Quote Post
piotrooo89
post 3.05.2010, 10:58:33
Post #8


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




to zrób takie same screen shoty tylko kliknij w zakładkę struktura.


--------------------
Go to the top of the page
+Quote Post
inwob
post 3.05.2010, 11:02:19
Post #9





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


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ę
Go to the top of the page
+Quote Post
Mchl
post 3.05.2010, 12:51:10
Post #10





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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


Ten post edytował Mchl 3.05.2010, 12:52:11
Go to the top of the page
+Quote Post
inwob
post 3.05.2010, 13:05:08
Post #11





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


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ąć
Go to the top of the page
+Quote Post
Mchl
post 3.05.2010, 13:19:45
Post #12





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Nigdzie nie korzystam z kolumny zysk. Odsyłam do kursu SQL.
Go to the top of the page
+Quote Post
inwob
post 3.05.2010, 13:32:59
Post #13





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


Cytat(Mchl @ 3.05.2010, 14:19:45 ) *
Nigdzie nie korzystam z kolumny zysk. Odsyłam do kursu SQL.



Kod
AS zysk
Go to the top of the page
+Quote Post
Mchl
post 3.05.2010, 14:05:44
Post #14





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Ja mówiłem poważnie.
http://www.w3schools.com/SQL/sql_alias.asp
Go to the top of the page
+Quote Post
inwob
post 3.05.2010, 15:05:59
Post #15





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


Cytat(Mchl @ 3.05.2010, 15:05:44 ) *


no dobra masz racje.
beda musial to jakos po swojemu zrobic bo nikt nie pomoze :\
Go to the top of the page
+Quote Post
Mchl
post 3.05.2010, 15:10:25
Post #16





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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.
Go to the top of the page
+Quote Post
inwob
post 3.05.2010, 17:06:55
Post #17





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


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. }


Ten post edytował inwob 3.05.2010, 17:26:07
Go to the top of the page
+Quote Post
Mchl
post 3.05.2010, 17:55:29
Post #18





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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ę.
Go to the top of the page
+Quote Post
inwob
post 3.05.2010, 19:05:59
Post #19





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 2.05.2010

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


wspólne kolumny to użytkownika, w tabeli typy, id jest numerem typu a nie numerem użytkownika

Go to the top of the page
+Quote Post
Mchl
post 3.05.2010, 20:05:17
Post #20





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


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?
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 31.07.2025 - 01:00