pbern
3.07.2003, 08:16:24
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.
wojtek
3.07.2003, 10:34:32
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..
uboottd
3.07.2003, 12:04:25
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]
pbern
3.07.2003, 14:05:08
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..
uboottd
3.07.2003, 14:57:20
#$$^&%*(^&%$#%^#*&*& !!!!
Zapomialem, oczywiscie na koncu musi byc GROUP BY goods.id ORDER BY goods.id
pbern
3.07.2003, 22:14:38
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

?
uboottd
4.07.2003, 09:32:45
<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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.