-mczlowiek-
23.07.2008, 07:06:05
mam 2 tabele, w jednej znajduja sie dyscypliny (id, nazwa);
Druga tabela zyski - słada sie z pól : (id, profit, dyscyplina);
przykład dla tebeli dyscypliny:
+--+---------+
|id |nazwa....|
+--+---------+
|.1.|pilka......|
|.2.|kosz.....|
itd
tabela zyski:
+---+------------+-------+
|.id.|dyscyplina.|.profit.|
+---+------------+-------+
|.1.|.........1.......|.4.5...|
|.2.|.........1.......|.6,0...|
|.3.|.........2.......|.-4,0..|
itd
i teraz chće zrobić takie coś , że podsumuje mi to wszystko w taki sposób:
piłka : 10,5
kosz : -4,0
...
Jak to wykonać, proszę o pomoc.
Pozdrawiam
JoShiMa
23.07.2008, 07:51:03
Tak powinno być dobrze:
SELECT d.nazwa,sum(z.profit) AS zysk FROM zyski z LEFT JOIN dyscypliny d ON d.id=z.dyscyplina GROUP BY z.dyscyplina
mczlowiek
23.07.2008, 08:10:26
niestety, albo ja coś źle napisałem, albo nie wiem co jet grane, wyskakuje błąd:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/tktbet/ftp/dzialy/statystyki.php on line 7
<?php
$sql = mysql_query("SELECT d.nazwa,sum(z.profit) AS zysk FROM zyski z LEFT JOIN dyscypliny d ON d.id=z.dyscyplina GROUP BY
z.dyscyplina");
}
?>
nospor
23.07.2008, 08:16:28
czemu nie uzyjesz mysql_error() by zobaczyc konkretnie co masz źle? Juz tyle razy ci to mowiono...
mczlowiek
23.07.2008, 08:22:59
ok, już poprawione, tylko że wyświetla mi dane które posiadaja jakąś wartośc a czy istnieje możliwość , żeby zrobić tak ze jeśli jakaś dyscyplina nie była przypisana to żeby pokazywała wartość "0"
np:
pilka 4,5
siatka -5
kosz 0
basebal 0
...
chodzi o to, żeby wyświetlalo wszystki dyscypliny a nie tylko te które maja jakas wartosc.
nospor jestem ci krewny browarka
nospor
23.07.2008, 08:25:54
skoro chcesz wyswietlac wszystkie dyscypliny to musisz zrobic na odwrot jak masz teraz, czyli musisz zrobic:
from dyscypliny left join zyski
wtedy dyscypliny sie beda wyswietlaly a zyski jak beda to sie dołączą, a jak nie bedzie to sie nie dołączą

Cytat
nospor jestem ci krewny browarka
Poprostu uzywaj mysql_error(), analizuj skrypty, i włącz raportowanie wszystkich bledow. Jak to zrobisz to bedzie dla mnie wystarczajace podziekowanie
JoShiMa
23.07.2008, 08:31:02
Cytat(mczlowiek @ 23.07.2008, 09:22:59 )

chodzi o to, żeby wyświetlalo wszystki dyscypliny a nie tylko te które maja jakas wartosc.
Albo tak:
SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN zyski z ON d.id=z.dyscyplina GROUP BY d.id
Albo tak:
SELECT d.nazwa,sum(z.profit) AS zysk FROM zyski z RIGHT JOIN dyscypliny d ON d.id=z.dyscyplina GROUP BY d.id
mczlowiek
23.07.2008, 08:32:37
nie no nie rozumiem za bardzo, dlaczego nie wyświetla wszystkich dyscyplin?
<?php
$sql = mysql_query("SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN typy z ON d.id=z.dyscyplina GROUP BY z.dyscyplina");
echo ('<table width="480"> <tr>
<td width=250>'.$w['nazwa'].'</td>
<td width=230>'.$w['zysk'].'</td>
</tr>
</table>');
}
?>
w tabeli mam 19 dyscyplin z czego 3 maja jakąs wartopść, a wyświetla mi sie tylko 4, tak:
piłka nożna
kosz 4,5
siatka 5,5
baseball -5
czyli tylko jedna wartosc ktora nic nie ma w tym przypadku piłka nożna , a dlaczego nie wyświetlaja sie pozostałe "zerowe"?
nospor
23.07.2008, 08:34:21
nie GROUP BY z.dyscyplina
a: GROUP BY d.id
grupujac po dyscyplinie z zyskow traciles te dyscypliny, ktore nie mialy zysku
JoShiMa
23.07.2008, 08:35:01
Nie przeczytałeś uważnie. Postrzelony jesteś. Daleko tak nie zajedziesz.
Spróbuj
GROUP BY d.id
mczlowiek
23.07.2008, 09:08:05
<?php
elseif($_GET['rok']){
$sql = mysql_query("SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN typy z ON d.id=z.dyscyplina GROUP BY 'd.nazwa' WHERE `z.data` BETWEEN '" . $date1 . "' AND '" . $date2 . "'");
?>
sorki, że Wam tak truje, ale kombinuje na 100i 1 sposobów i nie wiem dlaczego tak się dzieje, że to nie działa, bła który mi się wyświetla to:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `z.data` BETWEEN '2008-01-01' AND '2008-12-31'' at line 1
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/tktbet/ftp/dzialy/statystyki.php on line 34
JoShiMa
23.07.2008, 09:13:12
Może dlatego, że GROUP BY powinno być na końcu... Używasz w ogóle jakiegoś manuala, czy tak piszesz na czuja?
Poza tym jaki już piszesz zapytanie w cudzysłowie " to korzystaj z jego dobrodziejstw:
"SELECT d.nazwa,sum(z.profit) AS zysk FROM dyscypliny d LEFT JOIN typy z ON d.id=z.dyscyplina WHERE z.data BETWEEN '$date1 ' AND '$date2' GROUP BY d.nazwa"
i po co z.data i d.nazwa w apostrofach?
mczlowiek
23.07.2008, 09:18:00
tylko, że w momencie kiedy wpiszę tak jak powiedziałeś to znów nie wyświetla tych dyscyplin które mają "zerową" wartośc....
JoShiMa
23.07.2008, 09:27:19
Może trzeba napisac LEFT OUTER JOIN... Zadałeś sobie trud zdobycia wiedzy na temat tego jak działa JOIN i jakie są jego warianty? Weź się do roboty zamiast czekać na gotowe...
nospor
23.07.2008, 09:30:02
tu chodzi o ten warunek:
z.data BETWEEN '$date1 ' AND '$date2'
skoro pewne dyscypliny nie mają zaskow to i nie ma daty przy zyskach a co za tym idzie warunek nie jest spelniony. Tak proste ze az oczywiste

trzeba dac jeszcze z.id is null:
z.id is null or (z.data BETWEEN '$date1 ' AND '$date2')
mczlowiek
23.07.2008, 09:31:43
Joshima z całym szacunkiem, ale na prawde szuałem i za karzym razem wyświetla sie tylko te rekordy które maja jakąś wartośc... OUTER - też tylko te które mają wartość
nospor
23.07.2008, 09:33:28
dzieci*, spokoj!. Tu tylko ja mam monopol na wywolywanie sporow

Odpowiedź padła w moim poscie powyzej. A nastepnym razem staraj sie najpierw robic bez warunkow, a potem dopiero je dodawac. Bedziesz widzial gdzie jest potencjalny blad
dzieci* określenie zartobliwe, prosze sie nie obrazac
JoShiMa
23.07.2008, 09:43:01
Cytat(nospor @ 23.07.2008, 10:33:28 )

A nastepnym razem staraj sie najpierw robic bez warunkow, a potem dopiero je dodawac. Bedziesz widzial gdzie jest potencjalny blad

Słuszna uwaga. Ja tez się dałam nabrać
mczlowiek
23.07.2008, 10:37:54
Panowie, teraz dostaje info, ze nie ma takiej kolumny :k.id, lecz jest w rzeczywistosci
<?php
if($_GET['id_liga']){
$sql = " SELECT * FROM kluby k
LEFT JOIN zawodnicy z ON z.id_klub=k.id WHERE k.id_liga='".$_GET['id_liga']."'
GROUP BY k.nazwa ";
?>
o co tu chodzi?
nospor
23.07.2008, 10:44:14
Cytat
Panowie
podpaździocha na calej linii.... JoShima jest przedstawicielką plci pięknej. W ramach przeprosin slij jej szybko kwiaty

Skoro pisze ze nie ma, znaczy ze nie ma

Pokaza strukture tabeli i dokladnie komunikat jaki dostajesz
mczlowiek
23.07.2008, 10:47:10
ok, już nieaktualne!!!
joshima
dzieki za pomoc
------------
<?php
if($_GET['id_liga']){
$sql = " SELECT * FROM kluby k
LEFT JOIN zawodnicy z ON z.id_klub=k.id_klub WHERE k.id_liga='".$_GET['id_liga']."'
GROUP BY k.klub ";
$zm="";
echo '<table width="480">';
if($w['klub']!=$zm){
<td colspan="4" background="../images/tlo_newsy_linia.gif"></td>
</tr>';
}
<td width="250">';
if($w['klub']!=$zm){
echo ('<font face=verdana size =2 color=navy><b>'.$w['klub'].'</b></font>'); $zm=$w['klub'];
}else{
}
<td width=230><img src="images/listarrow.jpg"> '.$w['nazw'].' '.$w['imie'].'
</td>
</tr>';
}
}
?>
i teraz jak mam 2 zawodnikow przypisanych do jednego klubu to wyswietla mi tylko jednego, dlaczego skoro uzylem while?
wyglada to tak
druzyna1
druzyna 2
druzyna 3 zawodnik1
druzyna 4
druzyna 5 zawodnik 2
a powinno wyglladac tak:
druzyna1
druzyna 2
druzyna 3 zawodnik1
..............zawodnik3
druzyna 4
druzyna 5 zawodnik 2
itd
nospor
23.07.2008, 11:04:11
bo uzywasz group by
mczlowiek
23.07.2008, 11:16:54
zmieniłem na GROUP BY z.nazw
ale teraz wyswietla znow nie wszystkie kluby teraz jest tak:
klub1
klub2.....zawodnik1
............zawodnik2
i to koniec mimo iz dalej w kolejnym klubie sa przyporządkowani kolejni zawodnicy...
ręce opadają

<?php
if($_GET['id_liga']){
$sql = " SELECT * FROM kluby k
LEFT OUTER JOIN zawodnicy z ON z.id_klub=k.id_klub WHERE k.id_liga='".$_GET['id_liga']."'
ORDER BY k.klub ";
?>
mam tylko czy to jest poprawnie (działać działa)
JoShiMa
23.07.2008, 12:25:52
WHERE k.id_liga='".$_GET['id_liga']."'
Zdajesz sobie sprawę jakie to jest niebezpieczne?
W jakim celu robisz to grupowanie?
mczlowiek
24.07.2008, 11:46:52
dlaczego mówisz, że to jest niebezpieczne?
zapytanie polega to na tym , że ma kraje do których przypisane są ligi i jak kliknę w nazwę ligi to wtedy pobiera jej id i wyswietla wszystkie kluby które saw danej lidze
JoShiMa
24.07.2008, 11:49:45
Cytat(mczlowiek @ 24.07.2008, 12:46:52 )

dlaczego mówisz, że to jest niebezpieczne?
Dla tego, że to jest $_GET, czyli zmienna pochodzi z linku. Można więc w linku pod tą zmienną podstawić fragment zapytania SQL i zrobić poważne szkody w serwisie. Poczytaj sobie o SQL injection. Zmienne z $_GET a nawet z $_POST powinny być przed wstawieniem do stringu zapytania parsowane.
mczlowiek
24.07.2008, 12:09:16
nie zdawalem sobie sprawy, że to może być aż tak niebezpieczne.
Jak się przed tym zabezpieczyć, aby ktoś nie miał mozliwości ingerencji w moja bazę danych?
mike
24.07.2008, 12:11:37
Cytat(mczlowiek @ 24.07.2008, 13:09:16 )

Jak się przed tym zabezpieczyć, aby ktoś nie miał mozliwości ingerencji w moja bazę danych?
Temat rzeka. Zostało już na ten temat napisane wiele. Zacytuję:
Cytat(JoShiMa @ 24.07.2008, 12:49:45 )

Poczytaj sobie o SQL Injection.
pyro
24.07.2008, 12:12:04
jest tutorial na tym forum o sql injection
mczlowiek
24.07.2008, 12:14:04
no, tak, ale jeśli ktoś nie dzie wiedział jakie nazwy maja moje tabel w bazie to nic nie zrobi, dobrze mysle czy sie myle?
mike
24.07.2008, 12:15:37
Cytat(mczlowiek @ 24.07.2008, 13:14:04 )

no, tak, ale jeśli ktoś nie dzie wiedział jakie nazwy maja moje tabel w bazie to nic nie zrobi, dobrze mysle czy sie myle?
Mylisz się i to bardzo. Ponownie odsyłam do wyszukiwarki!
JoShiMa
24.07.2008, 13:03:36
Cytat(mczlowiek @ 24.07.2008, 13:14:04 )

no, tak, ale jeśli ktoś nie dzie wiedział jakie nazwy maja moje tabel w bazie to nic nie zrobi, dobrze mysle czy sie myle?
Nie ważne. Pokasuje Ci całe tabele hi hi hi
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.