Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie z 2 tabel - skomplikowane
Forum PHP.pl > Forum > Bazy danych
pbern
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
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
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
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
#$$^&%*(^&%$#%^#*&*& !!!!

Zapomialem, oczywiscie na koncu musi byc GROUP BY goods.id ORDER BY goods.id
pbern
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 questionmark.gif?
uboottd
<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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.