ugrás a tartalomhoz

SELECT a FROM-ban..., mivel váltható ki?

rebew · 2008. Jún. 3. (K), 21.13
sziasztok,
az alábbi egyszerű lekérdezési logika az én gépemen minden gond nélkül megy,
azonban át lett rakva egy régebbi MySQL-t futtató gépre,
ami nem ismeri a FROM-on belüli selectet...
Mivel lehetne ugyanezt elérni? Esetleg hasonlóan egyszerűen?

a lentebbi lekérdezést és teszt-táblát használva látható a lényeg; a rekordok "type" mezője alapján kell kategorizálni (group by)
és az így létrehozott csoportokból a legutolsó időpont kell

tábla:

mysql> select * from test.grpr;
+------+--------+-------------+----------+
| id   | type   | datum       | ido      |
+------+--------+-------------+----------+
| 1    | auto   | 2008.05.29. | 12:15:02 | 
| 2    | auto   | 2008.04.14. | 21:15:02 | 
| 3    | auto   | 2008.05.04. | 16:30:09 | 
| 4    | auto   | 2008.05.29. | 05:10:10 | 
| 5    | hajo   | 2008.04.21. | 17:40:42 | 
| 6    | hajo   | 2008.05.11. | 12:15:02 | 
| 7    | hajo   | 2008.05.11. | 10:20:02 | 
| 8    | repulo | 2008.05.20. | 12:15:02 | 
| 9    | repulo | 2008.05.20. | 11:38:17 | 
| 10   | repulo | 2008.05.08. | 10:20:00 | 
+------+--------+-------------+----------+
A lekérdezésben a FROM-ban levő SELECT csökkenő sorrendbe rendezi a táblát és ezt csoportosítja a GROUP BY
SELECT * FROM (SELECT * FROM test.grpr ORDER BY datum DESC, ido DESC) AS grpr GROUP BY type;
Ez a kimenete, és ez jó is, mert megkapom mindegyik csoporthoz kapcsolódó legutolsó, legmagasabb időpontot tartalmazó rekordot

mysql> SELECT * 
    -> FROM (SELECT * FROM test.grpr ORDER BY datum DESC, ido DESC) AS grpr
    -> GROUP BY type;
+------+--------+-------------+----------+
| id   | type   | datum       | ido      |
+------+--------+-------------+----------+
| 1    | auto   | 2008.05.29. | 12:15:02 | 
| 6    | hajo   | 2008.05.11. | 12:15:02 | 
| 8    | repulo | 2008.05.20. | 12:15:02 | 
+------+--------+-------------+----------+
3 rows in set (0.04 sec)
Szóval a kérdés; mivel lehet ugyanezt elérni és ezt a lekérdezést kiváltani?
--------------------------------------------------------------
Ez a teszt-tábla hozzá

create table test.grpr
(
id char(2),
type char(10),
datum char(15),
ido char(9)
);

insert into test.grpr values ('1','auto','2008.05.29.','12:15:02');
insert into test.grpr values ('2','auto','2008.04.14.','21:15:02');
insert into test.grpr values ('3','auto','2008.05.04.','16:30:09');
insert into test.grpr values ('4','auto','2008.05.29.','05:10:10');
insert into test.grpr values ('5','hajo','2008.04.21.','17:40:42');
insert into test.grpr values ('6','hajo','2008.05.11.','12:15:02');
insert into test.grpr values ('7','hajo','2008.05.11.','10:20:02');
insert into test.grpr values ('8','repulo','2008.05.20.','12:15:02');
insert into test.grpr values ('9','repulo','2008.05.20.','11:38:17');
insert into test.grpr values ('10','repulo','2008.05.08.','10:20:00');
 
1

Lehet, hogy hülyeség...

foxmulder · 2008. Jún. 4. (Sze), 00.10
...mert csak most kezdtem az SQL-lel komolyabban foglalkozni és épp ilyen feladatokra vadászom :), és azt sem tudom, hogy ha nem a FROM-on belül van a SELECT, azt megemészti-e a régebbi MySQL. Javaslatom:
SELECT id, type, datum, max(ido) FROM test.grpr
   WHERE datum IN (
      SELECT max(datum) FROM test.grpr GROUP BY type
   )
GROUP BY type;
Vagy egy egyszerűbb:

SELECT id, type, max(concat(datum, ' ', ido)) as 'utolso idopont' FROM test.grpr GROUP BY type;
2

elsővel baj

Drawain · 2008. Jún. 4. (Sze), 16.28
Az első megoldás sajnos biztosan nem jó régebbi mysql-ben, mert ebben is van beágyazott lekérdezés. Sajnos én is pont ilyen problémákkal küzködök mostanában, a szépen, jól megírt moduljaimat, lekérdezéseimet gányolhatom össze mert egyesek még ma is félnek váltani az 5-6 éves mysql4.0-ról...
3

másodikkal is

gex · 2008. Jún. 4. (Sze), 17.34
http://weblabor.hu/forumok/temak/13346#comment-27373
http://weblabor.hu/forumok/temak/21158#comment-53083
5

Jogos

foxmulder · 2008. Jún. 4. (Sze), 20.50
Esetleg egy vicces
SELECT ABS(id), type, stb...
? ;)
Egyébként ez a "minden mező legyen char" kényszerű örökség?
4

köszi

rebew · 2008. Jún. 4. (Sze), 20.09
köszi foxmulder, a lekérdezéseid működőképesek az otthoni gépemen, ha minden igaz, akkor holnap meg tudom nézni a másikon is, bár...

...Drawain szerint az első biztos nem müxik régebbi mysql-ben... nekem meg a második kétséges... mintha max-ban levő concat-ot probáltam volna már ott és nem ment, ...ha jól emlékszem...

már azon gondolkoztam, hogy csinálok egy nézettáblát, ami csak az eredeti tábla select * és order by desc, majd ezt kérdezem le és ebben a lekérdezésben group by...
6

Másodiknál rosszak az ID-k

saxus · 2008. Jún. 5. (Cs), 07.17
Igazából a második megoldásnak kellene a jónak lennie, valamiért viszont nem jó ID-t ad vissza.
7

Tényleg :(

foxmulder · 2008. Jún. 5. (Cs), 13.09
Persze, valszeg az elsőt adja vissza és nem azt, amelyikhez a legutóbbi datum+ido kombináció tartozik. Logikus, hiszen nincs WHERE (vagy inkább HAVING). Abban kéne varázsolni valami ilyesmit:
[de ezek hibásak, mert a WHERE-nél az = (vagy LIKE, hiszen stringekről van szó) jobb oldalán nem lehet függvény(?), a HAVING-nél meg azt hibaüzeni: "Unknown column 'datum' in having clause"]
...WHERE concat(datum, ' ', ido)=max(concat(datum, ' ', ido))...
vagy
...HAVING concat(datum, ' ', ido)=max(concat(datum, ' ', ido));
vagyis azt a sort adja vissza (ergo azt az ID-t), ahol a datum+ido kombó a legnagyobb. Passzolok...