ugrás a tartalomhoz

Pls help! MySQL feladvány

Silver · 2010. Júl. 4. (V), 03.56
Lenne egy látszólag egyszerű problémám, amivel így reggel 4 táján kicsit el vagyok akadva. Hátha valakinek eszébe jut valami frappáns megoldás...

Adott két tábla:

CREATE TABLE IF NOT EXISTS t_pro (
pro_id int(5) unsigned zerofill NOT NULL auto_increment,
pro_hw int(1) NOT NULL default '0',
hw_id tinyint(2) unsigned zerofill default NULL,
sw_id tinyint(2) unsigned zerofill default NULL,
pro_date datetime NOT NULL,
usr_id int(3) unsigned zerofill NOT NULL,
pf_id tinyint(1) NOT NULL,
env_id tinyint(1) NOT NULL,
sur_id tinyint(1) NOT NULL,
suly_id tinyint(1) NOT NULL,
pro_short varchar(100) collate utf8_unicode_ci NOT NULL,
pro_preformatted tinyint(1) NOT NULL default '0',
pro_text text collate utf8_unicode_ci,
pro_prework text collate utf8_unicode_ci,
pro_deduction text collate utf8_unicode_ci,
keu_id int(3) unsigned zerofill NOT NULL,
sta_id tinyint(1) NOT NULL,
pro_conn_pro_id int(5) unsigned zerofill default NULL,
PRIMARY KEY (pro_id),
KEY usr_id (usr_id),
KEY pf_id (pf_id),
KEY env_id (env_id),
KEY sur_id (sur_id),
KEY keu_id (keu_id),
KEY sta_id (sta_id),
KEY suly_id (suly_id),
KEY pro_hw (pro_hw)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE IF NOT EXISTS t_pro_his (
pro_his_id bigint(7) unsigned zerofill NOT NULL auto_increment,
pro_id int(5) unsigned zerofill NOT NULL,
usr_id int(3) unsigned zerofill NOT NULL,
pro_his_date datetime NOT NULL,
pro_his_preformatted tinyint(1) NOT NULL default '0',
pro_his_text text collate utf8_unicode_ci NOT NULL,
pro_his_on tinyint(1) NOT NULL default '1',
PRIMARY KEY (pro_his_id),
KEY usr_id (usr_id),
KEY pro_his_date (pro_his_date),
KEY pro_his_preformatted (pro_his_preformatted),
KEY pro_his_on (pro_his_on),
KEY pro_id (pro_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


Az egyikbe (t_pro) bekerulnek a hibabejelentések. Ha a hibával foglalkozunk, akkor az egyes hibabejelentésekhez társulnak naplóbejegyzések (t_pro_his). Több naplóbejegyzés is létezhet egy hibabejelentéshez.
A feladvány az, hogy legyen egy SELECT-em vagy rosszabb esetben valami beágyazott eljárásom / függvényem, ami tudja a következőt:
listázza ki az összes hibát oly módon, hogy minden egyes hiba csak EGYSZER szerepeljen a listaban, de a megjelenés alakuljon ugy, hogy az utolso naplo bejegyzes szerinti sorrendben legyen rendezve.

Eddig ez az alább látható ötletem volt, de nem jó, mert ha már akadnak eltérő dátummal napló bejegyzések, akkor egy hiba többször is megjelenik a listában

create view v_pro_quick as
select distinct
h.pro_id,
h.pro_his_date,
p.pro_date,
p.pro_short
from t_pro_his as h
left join t_pro as p
on h.pro_id=p.pro_id
(és akkor lehet mondjuk a vegere, hogy)
order by pro_his_date desc;
(itt az "order by"-ban akartam eredetileg meghatározni, hogy pro_id vagy pro_his_date alapján legyen rendezve ASC vagy DESC, mert akkor multifunkciós lenne)

Köszi a segítséget!
 
1

Megoldva

Silver · 2010. Júl. 4. (V), 14.24
Közben egy másik fórumon kaptam egy nagyon egyszerű és szép megoldást:
select
  p.*,
  (select
    max( h.pro_his_date )
    from
      t_pro_his h
    where
      h.pro_id = p.pro_id
  ) as pro_his_date
from
  t_pro p
order by
  pro_his_date desc;
2

subquery

Ifju · 2010. Júl. 5. (H), 09.10
Hali!

Vedd figyelembe, hogy ez a megoldás úgy működik, hogy a t_pro táblád minden egyes rekordjára indít a mysql egy újabb queryt, ami párezer rekordnál már érezhető lassulást okozhat, és a rekordszám növekedésével egyre nagyobb terhelést fog okozni.

Az eredeti próbálkozásod nem rossz, csupán a left join működéséből fakadóan ad vissza több rekordot: minden hibához társítja az összes history bejegyzést, és így adja vissza. Ezt aggregációval lehet kezelni.
Próbáld ki ezt:

SELECT h.pro_id,
MAX(h.pro_his_date) AS pro_his_date,
p.pro_date, p.pro_short
FROM t_pro AS p
LEFT JOIN t_pro_his AS h
USING(pro_id)
GROUP BY p.pro_id
ORDER BY ...