ugrás a tartalomhoz

Php group by és order by hiba

geforce9600gt · 2015. Dec. 5. (Szo), 20.51
Sziasztok!
$get_osztalyzatok = mysqli_query($kapcs, "SELECT * FROM jegy WHERE jegy_diak = '$id' GROUP BY jegy_ev ORDER BY jegy_honap ASC") or die(mysqli_error($kapcs));
8 találat lenne a táblában, de csak kettőt ad vissza, egy olyat ahol az év 2015, és egy olyat, ahol 2016. Pedig 2015-ösből van vagy 7 sor.

Mit rontok el?
 
1

Ennek semmi köze PHP-hoz, ez

kuka · 2015. Dec. 5. (Szo), 21.19
Ennek semmi köze PHP-hoz, ez sima SQL kérdés.

Minekutána azt mondtad, hogy csoportosítsa jegy_ev, természetesen az adott mező egyedi értékeit adja vissza.

Pontosabban mi is a célod?
2

A diákok minden hónapra

geforce9600gt · 2015. Dec. 5. (Szo), 21.29
A diákok minden hónapra kapnak egy 1-5-ig osztályzatot. Beíráskor a tanár kiválasztja az adott tanévet és hónapot, és ennyi.

És kiíratáskor csoportosítva szeretném kirakni, év szerint csökkenőben, és azon belül a hónap szerint növekvő sorrendben.

Pl:

Dátum Osztályzat

2016-01-30 - 4
2015-10-30 - 3
2015-11-30 - 3
2015-12-30 - 4
3

Ezek szerint te egyszerűen

kuka · 2015. Dec. 5. (Szo), 21.41
Ezek szerint te egyszerűen csak több mező szerint akarsz csoportosítani:

SELECT *
FROM jegy
WHERE jegy_diak = '$id'
GROUP BY jegy_ev, jegy_honap
ORDER BY jegy_ev DESC, jegy_honap
4

Nagyon jó, köszöntem szépen a

geforce9600gt · 2015. Dec. 5. (Szo), 21.57
Nagyon jó, köszöntem szépen a segítséget!
11

szerintem amúgy a group by

szabo.b.gabor · 2015. Dec. 8. (K), 09.58
szerintem amúgy a group by jelen esetben teljesen felesleges meg egy kicsit zavaró is. ha mondjuk egy hónapban több jegyet kaphatna valaki és mondjuk azok átlagát kellene kiírni, akkor indokolt volna a GROUP BY egy AVG párral, de így most épp semmit nem csinál.
SELECT *  
FROM jegy  
WHERE jegy_diak = '$id' 
ORDER BY jegy_ev DESC, jegy_honap
12

így most épp semmit nem

kuka · 2015. Dec. 9. (Sze), 09.47
így most épp semmit nem csinál
Tényleg. :(
mysql> create table jegy ( id int primary key auto_increment, jegy_diak int default 0, jegy_ev int, jegy_honap int );
Query OK, 0 rows affected (0.44 sec)

mysql> insert into jegy (jegy_ev, jegy_honap) values (2014, 1), (2014, 2), (2014, 2), (2014, 2), (2015, 2), (2015, 2);
Query OK, 6 rows affected (0.14 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from jegy where jegy_diak = 0 group by jegy_ev, jegy_honap order by jegy_ev desc, jegy_honap;
+----+-----------+---------+------------+
| id | jegy_diak | jegy_ev | jegy_honap |
+----+-----------+---------+------------+
|  5 |         0 |    2015 |          2 |
|  1 |         0 |    2014 |          1 |
|  2 |         0 |    2014 |          2 |
+----+-----------+---------+------------+
3 rows in set (0.02 sec)

mysql> select * from jegy where jegy_diak = 0 order by jegy_ev desc, jegy_honap; 
+----+-----------+---------+------------+
| id | jegy_diak | jegy_ev | jegy_honap |
+----+-----------+---------+------------+
|  5 |         0 |    2015 |          2 |
|  6 |         0 |    2015 |          2 |
|  1 |         0 |    2014 |          1 |
|  2 |         0 |    2014 |          2 |
|  3 |         0 |    2014 |          2 |
|  4 |         0 |    2014 |          2 |
+----+-----------+---------+------------+
6 rows in set (0.00 sec)
13

A diákok minden hónapra

Endyl · 2015. Dec. 9. (Sze), 11.28
A diákok minden hónapra kapnak egy 1-5-ig osztályzatot. Beíráskor a tanár kiválasztja az adott tanévet és hónapot, és ennyi.

És kiíratáskor csoportosítva szeretném kirakni, év szerint csökkenőben, és azon belül a hónap szerint növekvő sorrendben.


Elvileg minden hónapra csak egy osztályzat van, így, ahogy szabo.b.gabor írja, felesleges a GROUP BY. Valamint a "kiíratáskor év szerint csökkenő, hónap szerint növekvő sorrendű csoportosításból" is az jön le, hogy ez csak rendezés. Ehhez még hozzájön, hogy ha nincs semmi aggregáló függvény a lekérdezésben (mint a már említett átlag), akkor ha több jegy lenne egy hónapban (de elvileg csak egy van), akkor értelmetlen a jegy ilyen módú lekérdezése (hacsak nem az a kérdés, hogy melyik hónapokra kapott valaki bármilyen jegyet).
14

Ah, hogy itt kapott hangsúlyt

kuka · 2015. Dec. 9. (Sze), 11.36
Ah, hogy itt kapott hangsúlyt az az „egy”. Elsőre stilisztikai elcsúszásnak tűnt és átsiklottam fölötte. Akkor valóban nincs mit csoportosítani.
5

sql injection

solkprog · 2015. Dec. 7. (H), 22.11
Légy-szíves olvass utána az sql injection -nak. A fenti kódot törhető.
illetve erősen javaslom hogy térj át a PDO-ra. (és ott is védekezz az sql injection ellen)
6

A fenti kódot törhető.Én ez

kuka · 2015. Dec. 7. (H), 22.18
A fenti kódot törhető.
Én ezt azért nem állítanám ilyen határozottan. Honnan tudod, hogy két sorral az idézett kódrészlet előtt nem uszította rá a mysqli_real_escape_string()-et a $id változóra?
7

tippeltem

solkprog · 2015. Dec. 7. (H), 23.01
Először is elnézést ha tévedtem, és megbántottam a kérdezőt. Tippeltem:
- keverve használ magyar, és angol szavakat/kifejezéseket.
- nincs beformázva a kódja.
- kérdése is kezdőre utal.
- deprecated függvényt használ.

ezekből.
Illetve elnézést elszoktam a mysqli_ hülyeségtől, elég régóta keretrendszerhez, pdo-hoz (bind-oláshoz) szoktam ahol nincs kézzel aposztrofálás a queryben. (vagyis ott ez a jegy_diak = '$id' nem annyira működik bindolva)

Jelzem hogy nem baj hogy kezdő, és örülünk (örülök) hogy még járnak kezdők (is?) a weblabor-ra, és hajrá!
8

Deprecated?

Endyl · 2015. Dec. 7. (H), 23.09
Melyik verzióban lesz deprecated a mysqli kiterjesztés? Vagy kevered az eredeti mysql extensionnel vagy belsős infóid vannak :) Mindenesetre a manual még "ajánlottként" tartja számon a mysqli-t.
Ettől függetlenül még igaz, hogy prepared statementekkel (akár mysqli, akár pdo) nehezebb lábonlőni magunkat egy elfelejtett escape-eléssel.
9

hm. megkövetem magam.

solkprog · 2015. Dec. 7. (H), 23.35
fáradt vagyok.
nem tudom mit néztem, vagy tényleg a mysql_ vagy valamelyik mysqli_ amit tényleg deprecated/removed. (most megnéztem nem sok de tényleg van pár függvény ami az)

Szerkesztve: megnézem, még csak szavazás se volt arról hogy kivezessék a mysqli_ globálisan. - és valószínűleg a mindenre legyen sima függvényes alternatíva php-ban mániának hála egy jó darabig nem is lesz kivezetve. (sajnos)
Sőt a mysql_ kivezetése se a "mindenki megszavazta" kategória volt. (bár azért egyértelmű többséggel szavazták meg vagy inkább ki:))
10

"Honnan tudod, hogy két

pp · 2015. Dec. 8. (K), 06.13
"Honnan tudod, hogy két sorral az idézett kódrészlet előtt nem uszította rá a mysqli_real_escape_string()-et a $id változóra"

Nálam alaptézis, hogy ha tudnom/néznem/keresnem kell, akkor rossz a kód.

pp