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