Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako izdvojiti sve skupove koji sadrže zadati podskup?

[es] :: MySQL :: Kako izdvojiti sve skupove koji sadrže zadati podskup?

[ Pregleda: 1872 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

BigFoot
Boban Jovanović
Arilje

Član broj: 1098
Poruke: 991
93.86.212.*



+35 Profil

icon Kako izdvojiti sve skupove koji sadrže zadati podskup?24.10.2009. u 23:59 - pre 176 meseci
Npr. ako se radi o fakturama, a veza izmedju zaglavlja i stavki je master - details tipa, kako izdvojiti samo one fakture koje sadrže zadati podskup artikala.
Npr.
Code:
BR_FAK SIFRA_ART
   1         1
   1         2    <-- v1
   1         3    <-- v2
   1         4    <-- v3
   1         5
   2         2    <-- v1
   2         3    <-- v2
   2         4    <-- v3
   2         8
   3         1
   3         5
   4         2    <-- v1
   4         3    <-- v2
   4         4    <-- v3
   4         9
...


Traženi skup artikala npr. ima šifre (v1, v2, v3) = (2, 3, 4). Kako pronaći sve fakture koje sadrže ovaj podskup, ovde BR_FAK = (1, 2, 4)? Deluje jednostavno ili možda nije...
Two beer or not two beer...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?25.10.2009. u 07:45 - pre 176 meseci
posle cetvrtog citanja pitanja - nemam pojma sta pitas.

aj ti daj podatke i daj rezultat pa ce ti kazemo kako da napravis od podataka rezultat ... ove sintakse sa strelicama nisu jasne ... mislim, zasto je 1,2 v1 a 1,3 v2?

ako uzmes da je table sa fakturama

faktura (faktura_id int, faktura_datum datetime, faktura_kupac int, faktura_vrednostbp int, faktura_porez in);
faktura_stavka (faktura_stavka_id int, faktura_id int, artikl_id int, artikl_cena int);

ti hoces sve fakture koje imaju artikl_id = 10? select distinct faktura_id from faktura_stavka where artikl_id=10; ??

ako oces da ima 10 ili 15 onda isto to samo u where imas where artikle_id=10 or artkl_id=15 ... ili mozes where artikl_id in (10,15,20,21,22 ...) ...

za varijantu da hoces artikle koji imaju "tacno artikle 2 22 34 i 256" moras da koristis gadne upite poput

Code:

select faktura_id, group_concat(artikl_id order by artikl_id separator ',') as artikli from faktura_stavka where artikl_id in (2,22,34,256) having artikli='2,22,34,256';


ili mozes da probas self join ali u 8 ujutro nema sanse da to cukam tako da moz da probas sam :D (iskreno ne pada mi trenutno na pamet kako bi isao taj join ali ako se dobro secam moze)
 
Odgovor na temu

BigFoot
Boban Jovanović
Arilje

Član broj: 1098
Poruke: 991
93.86.212.*



+35 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?25.10.2009. u 09:11 - pre 176 meseci
Najprostije: trebaju mi fakture na kojima se nalaze sva tri zadata artikla.

Podaci su:

Code:
BR_FAK SIFRA_ART
   1         1
   1         2
   1         3
   1         4
   1         5
   2         2
   2         3
   2         4
   2         8
   3         1
   3         5
   4         2
   4         3
   4         4
   4         9
...


Tražim sve BR_FAK koji sadrže sve SIFRA_ART = (2, 3, 4). Rezultat treba da bude BR_FAK = (1, 2, 4).

Strelice pokazuju tražene podatke, a vidi se da je tražena trojka pronadjena u fakturama broj 1, 2 i 4. Npr. u 3. su samo šifre 1 i 5, dakle ne i tražene 2, 3 i 4. Dakle, koje fakture sadrže traženu grupu artikala, a ne svaki pojedinačno? Npr. tražim kupce koji su na jednoj fakturi imali šećer, kafu i čokoladu u kompletu. Probao sam nešto sa 3 INNER JOIN-a, ali mislim da nije dobro. Rekoh da deluje da je jednostavno...
Two beer or not two beer...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?25.10.2009. u 09:40 - pre 176 meseci
group_concat primer ti daje rezultat u slucaju da trazis one koji imaju sva tri i samo ta tri. problem je ako trazis 1,3,5 neko ko ima 1,2,3,5 ti nece biti "pronadjen" - ako ti takav uopste treba ... dakle ako ti to radi posao, to ti je najjednostavniji upit (nije neko ludilo od brzine posto se na mysql-u having radi tako sto se pri slanju na klijent filtriraju rezultati po having uslovu.. sam having uslov ne ucestvuje u upitu, zato sam dodao ono in(1,2,3) da bi bar malo smanjio result set koji se onda filtrira sa having).

ako hoces da "imaju sva ta tri + bilo sta drugo" onda je komplikovanije ..

najjednostavniji nacin je da pokupis sve koji imaju prvi, sve koji imaju drugi i sve koji imaju treci:

Code:


select faktura_id from 
  (select faktura_id from faktura_stavka where artikl_id = 1) prvi 
join
  (select faktura_id from faktura_stavka where artikl_id = 3) drugi using (faktura_id) 
join
  (select faktura_id from faktura_stavka where artikl_id = 5) treci using (faktura_id)

order by faktura_id;





npr:
Code:

mysql> create table faktura_stavka (faktura_id int, artikl_id int) engine=myisam;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into faktura_stavka values (1,1),(1,2),(1,3),(1,4),(1,5),(2,2),(2,3),(2,4),(2,8),(3,1),(3,5),(4,2),(4,3),(4,4),(4,9);
Query OK, 15 rows affected (0.06 sec)
Records: 15  Duplicates: 0  Warnings: 0
mysql> select faktura_id from
    ->   (select faktura_id from faktura_stavka where artikl_id = 1) prvi
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 2) drugi using (faktura_id)
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 3) treci using (faktura_id)
    -> ;
+------------+
| faktura_id |
+------------+
|          1 | 
+------------+
1 row in set (0.00 sec)

mysql> select faktura_id from
    ->   (select faktura_id from faktura_stavka where artikl_id = 1) prvi
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 3) drugi using (faktura_id)
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 5) treci using (faktura_id)
    -> ;
+------------+
| faktura_id |
+------------+
|          1 | 
+------------+
1 row in set (0.00 sec)

mysql> select faktura_id from
    ->   (select faktura_id from faktura_stavka where artikl_id = 2) prvi
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 3) drugi using (faktura_id)
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 4) treci using (faktura_id)
    -> ;
+------------+
| faktura_id |
+------------+
|          1 | 
|          2 | 
|          4 | 
+------------+
3 rows in set (0.01 sec)

mysql> select faktura_id from
    ->   (select faktura_id from faktura_stavka where artikl_id = 2) prvi
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 3) drugi using (faktura_id)
    -> join
    ->   (select faktura_id from faktura_stavka where artikl_id = 8) treci using (faktura_id)
    -> ;
+------------+
| faktura_id |
+------------+
|          2 | 
+------------+
1 row in set (0.00 sec)

mysql> 



problem je sto ako hoces (1,2,3,4) onda mora jos jedan join, ne moze "univerzalno za bilo koji broj artikala" .. tj bar meni ne pada napamet kako bi moglo za razlicit broj artikala
 
Odgovor na temu

BigFoot
Boban Jovanović
Arilje

Član broj: 1098
Poruke: 991
93.86.212.*



+35 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?25.10.2009. u 11:49 - pre 176 meseci
Ok, ovo sa više JOIN-a sam imao i izgleda da ne može bolje. I, da, trebaju mi one koje sadrže najmanje ceo traženi skup, a mogu naravno i više od toga.
Two beer or not two beer...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?25.10.2009. u 15:47 - pre 176 meseci
ne pada mi nista bolje od ovog joina na pamet .. ako se setis necega, slobodno podeli sa nama :)
 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?26.10.2009. u 10:18 - pre 176 meseci
Probaj ovako:

SELECT COUNT(DISTINCT sifra_art) AS nadjenihstavki, br_fak
FROM faktura_stavka
WHERE sifra_art IN (2,3,4)
GROUP BY br_fak
HAVING nadjenihstavki = 3

Ne znam koje rešenje će biti brže, mrzi me sada da testiram, ali ovo će za sve fakture pobrojati koliko traženih stavki ima i vratiće samo one fakture koje imaju sve iste stavke (može biti više stavki nego tražene). Ona druga trojka treba da bude broj stavki koje tražiš. Znači da se nađu sve fakture sa pet odabranih stavki:

SELECT COUNT(DISTINCT sifra_art) AS nadjenihstavki, br_fak
FROM faktura_stavka
WHERE sifra_art IN (2,3,4,7,16)
GROUP BY br_fak
HAVING nadjenihstavki = 5
"Common sense is not so common." - Voltaire
 
Odgovor na temu

BigFoot
Boban Jovanović
Arilje

Član broj: 1098
Poruke: 991
93.87.133.*



+35 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?26.10.2009. u 23:29 - pre 176 meseci
Bravo! Ovo je pravo rešenje! Pokušavao sam i sa HAVING, ali mi je nedostajalo ovo da zapišem da dužina kombinacije budu upravo koliko šifara ima.
Two beer or not two beer...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?27.10.2009. u 08:00 - pre 176 meseci
extra resenje, obrati samo paznju da ne smes da imas isti artikl u fakturi dvatput inace ce ti s*i koncept :)


 
Odgovor na temu

BigFoot
Boban Jovanović
Arilje

Član broj: 1098
Poruke: 991
93.87.133.*



+35 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?27.10.2009. u 09:53 - pre 176 meseci
Uobičajeno je da nemaš 2 puta isti artikal, već se količine sabiraju i evidentira jedan, čak i ako se 2 puta unese.
Two beer or not two beer...
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?27.10.2009. u 10:04 - pre 176 meseci
potpuno se slazem, rekoh da je ideja odlicna :)
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Kako izdvojiti sve skupove koji sadrže zadati podskup?27.10.2009. u 11:01 - pre 176 meseci
Citat:
BigFoot: Uobičajeno je da nemaš 2 puta isti artikal, već se količine sabiraju i evidentira jedan, čak i ako se 2 puta unese.


A i stavljeno je
Code:
SELECT COUNT(DISTINCT sifra_art)

pa ni to ne bi smetalo :P
 
Odgovor na temu

[es] :: MySQL :: Kako izdvojiti sve skupove koji sadrže zadati podskup?

[ Pregleda: 1872 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.