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:
  1. mysql> select * from test.grpr;  
  2. +------+--------+-------------+----------+  
  3. | id   | type   | datum       | ido      |  
  4. +------+--------+-------------+----------+  
  5. | 1    | auto   | 2008.05.29. | 12:15:02 |   
  6. | 2    | auto   | 2008.04.14. | 21:15:02 |   
  7. | 3    | auto   | 2008.05.04. | 16:30:09 |   
  8. | 4    | auto   | 2008.05.29. | 05:10:10 |   
  9. | 5    | hajo   | 2008.04.21. | 17:40:42 |   
  10. | 6    | hajo   | 2008.05.11. | 12:15:02 |   
  11. | 7    | hajo   | 2008.05.11. | 10:20:02 |   
  12. | 8    | repulo | 2008.05.20. | 12:15:02 |   
  13. | 9    | repulo | 2008.05.20. | 11:38:17 |   
  14. | 10   | repulo | 2008.05.08. | 10:20:00 |   
  15. +------+--------+-------------+----------+  
A lekérdezésben a FROM-ban levő SELECT csökkenő sorrendbe rendezi a táblát és ezt csoportosítja a GROUP BY
  1. SELECT * FROM (SELECT * FROM test.grpr ORDER BY datum DESC, ido DESCAS grpr GROUP BY type;  
Ez a kimenete, és ez jó is, mert megkapom mindegyik csoporthoz kapcsolódó legutolsó, legmagasabb időpontot tartalmazó rekordot
  1. mysql> SELECT *   
  2.     -> FROM (SELECT * FROM test.grpr ORDER BY datum DESC, ido DESCAS grpr  
  3.     -> GROUP BY type;  
  4. +------+--------+-------------+----------+  
  5. | id   | type   | datum       | ido      |  
  6. +------+--------+-------------+----------+  
  7. | 1    | auto   | 2008.05.29. | 12:15:02 |   
  8. | 6    | hajo   | 2008.05.11. | 12:15:02 |   
  9. | 8    | repulo | 2008.05.20. | 12:15:02 |   
  10. +------+--------+-------------+----------+  
  11. 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á
  1. create table test.grpr  
  2. (  
  3. id char(2),  
  4. type char(10),  
  5. datum char(15),  
  6. ido char(9)  
  7. );  
  8.   
  9. insert into test.grpr values ('1','auto','2008.05.29.','12:15:02');  
  10. insert into test.grpr values ('2','auto','2008.04.14.','21:15:02');  
  11. insert into test.grpr values ('3','auto','2008.05.04.','16:30:09');  
  12. insert into test.grpr values ('4','auto','2008.05.29.','05:10:10');  
  13. insert into test.grpr values ('5','hajo','2008.04.21.','17:40:42');  
  14. insert into test.grpr values ('6','hajo','2008.05.11.','12:15:02');  
  15. insert into test.grpr values ('7','hajo','2008.05.11.','10:20:02');  
  16. insert into test.grpr values ('8','repulo','2008.05.20.','12:15:02');  
  17. insert into test.grpr values ('9','repulo','2008.05.20.','11:38:17');  
  18. 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:
  1. SELECT id, type, datum, max(ido) FROM test.grpr  
  2.    WHERE datum IN (  
  3.       SELECT max(datum) FROM test.grpr GROUP BY type  
  4.    )  
  5. GROUP BY type;  
Vagy egy egyszerűbb:
  1. 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
  1. 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"]
  1. ...WHERE concat(datum, ' ', ido)=max(concat(datum, ' ', ido))...  
vagy
  1. ...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...