![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 3.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
Mam 2 tabele.. jedna to tabela z towarami, druga z diagnostykami (przy czym w tej drugiej moze byc X rekordow dotyczacych jednego towaru)
moje pytanie to jak napisac zapytanie ktore by wyciagalo dane dotyczace towaru + ostatnia z diagnostyk dotyczaca tego towaru. Struktura bazy: [sql:1:bafb259a7c] CREATE TABLE goods ( id int(11) NOT NULL auto_increment, id_client int(11) NOT NULL default '0', goods_name varchar(128) NOT NULL default '', place varchar(16) default NULL, sn varchar(32) NOT NULL default '', nr_rachunku varchar(32) NOT NULL default '', destription blob NOT NULL, data_in date NOT NULL default '0000-00-00', worker int(11) NOT NULL default '0', PRIMARY KEY (id), UNIQUE KEY id (id) ) TYPE=MyISAM PACK_KEYS=0 CHECKSUM=1 AUTO_INCREMENT=31 ; CREATE TABLE diagnostyki ( id int(11) NOT NULL auto_increment, id_goods int(11) NOT NULL default '0', diagnoza text NOT NULL, worker int(11) NOT NULL default '0', data timestamp(14) NOT NULL, PRIMARY KEY (id), UNIQUE KEY id (id) ) TYPE=MyISAM AUTO_INCREMENT=94 ; [/sql:1:bafb259a7c] Ja wykombinowalem takie cos [sql:1:bafb259a7c] select goods.id,goods.goods_name,diagnostyki.diagnoza from goods,diagnostyki where diagnostyki.id_goods=goods.id ORDER by id; [/sql:1:bafb259a7c] jednak wykorzystuje on wszytkie diagnostyki dla danego towaru.. a mnie interesuje tylko ostatnia. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: -- Ostrzeżenie: (0%) ![]() ![]() |
Mozna to zrobic na dwa sposoby, pierwszy:
(na koncu dodajesz:) [sql:1:8ba9fe59a2] ORDER BY ID DESC LIMIT 0,1 [/sql:1:8ba9fe59a2] lub: [sql:1:8ba9fe59a2] SELECT MAX(goods.id),goods.goods_name,diagnostyki.diagnoza FROM goods,diagnostyki WHERE diagnostyki.id_goods=goods.id [/sql:1:8ba9fe59a2] to chyba tez zadziala.. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
To drugie juz parser wywali AFAIK.
Natomiast rozwiazanie ktore robi dokladnie to co jest w zadaniu jest troche grzybiarskie, poniewaz mysql nie wspiera subzapytan, a to jest zadanie wlasnie na subselect. [sql:1:fac9547415] SELECT goods.id,goods.goods_name,substring(max(concat(lpad(diagnostyki.id,11,'0'),diagnostyki.diagnoza)),12) as diagnoza FROM gods, diagnostyki WHERE diagnostyki.id_goods=goods.id ORDER BY goods.id [/sql:1:fac9547415] |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 3.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
niestety to zapytanie konczy sie bledem:
ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause a samo zapytanie [sql:1:85d1740de6] select max(concat(lpad(diagnostyki.id,0,'0'),diagnostyki.diagnoza)),1 from diagnostyki ;[/sql:1:85d1740de6] takze daje bardzo dziwny wynik. a mi chodzi o takie cos |nazwa towaru|jego dane etc|ostatnia z diagnoz majaca id_goods tego towaru. przy czym nie chodzi o ostatni towar.. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
#$$^&%*(^&%$#%^#*&*& !!!!
Zapomialem, oczywiscie na koncu musi byc GROUP BY goods.id ORDER BY goods.id |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 3.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
Wielkie dzieki za pomoc...
ostateczne zapytanie wyglada tak [sql:1:09128a411e] SELECT goods.id,goods.goods_name,goods.destription,substring(max(concat(lpad(diagnostyk .id,11,'0'),diagnostyki.diagnoza)),12) AS diagnoza FROM goods, diagnostyki WHERE goods.place='$place' and diagnostyki.id_goods=goods.id GROUP BY goods.id ORDER BY $sort [/sql:1:09128a411e] tylko moglbys mi jeszcze wytlumaczyc co dokladnie robi concat i lpad oraz skad 11 i 12 ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
<wiedza_tajemna>
dziala to wedlug takiej zasady: 1. bierzemy id z tabeli podrzednej (diagnostyki.id) 2. konwertujemy tego id na stringa i lpadem wyrownujemy do 11 znakow uzupelniajac zerami z lewej strony (int moze miec max 11 znakow o ile nie jest big) 3. do tego stringa concatem doklejamy ciag znakow ktory chcemy uzyskac (czyli diagnostyki.diagnoza) 4. w mysql-u max i min dzialaja rowniez na stringach, wiec wykorzystujac max-a z danej grupy bierzemy ten string ktory alfabetycznie jest najstarszy, a poniewaz pierwsze 11 znakow to nasz id to oznacza ze bierzemy wiersz w ktorym bylo najwieksze id, a poniewaz sortujemy alfabetycznie to musielismy uzupelnic zerami ( bo co prawda 11>9, ale '11'<'9', a po uzupelnieniu znow '11'>'09') 5. substringiem pomijamy pierwsze 11 znakow wyniku, biorac string od znaku 12-stego. 6. cieszymy sie wynikiem. </wiedza_tajemna> Tak w ogole to ten grzyb jest wziety z manuala MySQL-owego. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 04:06 |