SQL upit

Pozdrav, molio bih malu pomoć oko sql upita.
Podaci mi izgledaju nekako ovako:

podatak1: 17, 2, 4, 9, 3, 54, 21, 13
podatak2: 45, 12, 54, 36,17, 25, 26, 13, 84, 72, 59, 14, 7
podatak3: 17, 2, 4, 9, 3, 54, 21, 13, 78, 44
podatak4: 17, 45, 21, 5
itd.

Znaci svaki podatak ima za sebe vezan skup brojeva. Kolicina tih brojeva nije odredjena kao sto se vidi …niti idu po velicini. Jedino pravilo je da nema brojeva koji se ponavljaju unutar istog podatka!

Ono sto pretraga treba uciniti:
Recimo imam dva broja 17 i 13…treba naci sve podatke koji sadrzavaju ta dva broja. U ovom slucaju to su podatak1, podatak2 i podatak 3
Podatke zapisujem u jednu tablicu s dvije kolone. Lijeva kolona je ID podatka, desna kolona je jedan od brojeva. Znaci cijeli podatak je zapisan u više redova…svaki red po jedan broj.
Ono što moj primitivizam sa SQL upitima zna je izdvojiti sve podatke koji imaju broj 17, zatim sve podatke koji imaju broj 13. Presjek ta dva skupa je tražno rješenje. Vjerujem da ima elegantni SQL upit za to.

Ako je pametnije na neki drugi način spremati takav podatak u tablice, volio bi takodjer čuti.

ALI …ima još jedna stvar.
Pretraga treba dati prednost onim podacima u kojima su brojevi istaknuti više prema rubovima.
Znaci podatak1 je najkvaliteniji rezultat pretrage jer bolje od toga nemoze. Ima 17 na pocetku i 13 na začelju. Zatim ga slijedi podatak3 i zadnje prihvatljivo rješenje je podatak2.
Nekako sumnjam da se i ovaj dio može sa SQL upitom rješiti…to ću ostaviti za kasniju analizu…ali ako se slucajno moze …primam prijedloge :slight_smile:

Za upit sam se snasao (ako valja) …i izgleda ovako:

$query=“SELECT * FROM podatakImaBroj WHERE broj=17 AND podatakID IN (SELECT podatakID FROM podatakImaBroj WHERE broj=13)”;
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo $row[‘podatakID’];
echo $row[‘broj’];
}

…jedino me nesto malo muci. Na ovaj nacin dohvacam sve ID-ove podataka, taj dio mi je oke. Ali neznam ocitati niti jednu vrijednost iz one linije gdje je broj 13. Ovako su prakticki dohvacene samo linije gdje je broj 17.
Naravno da mogu pomoću dohvaćenog podatkaID opet zaroniti i vidjeti sto je i u ostalim linijama…ali nekako mi logično da bi u ovoj fazi već trebao baratati nekako s tim podacima, a da neznam kako.

Rjeseno nekako ovako:

ALI, tu nemam nikakvu informaciju o “koraku”.
Recimo da je korak još jedan column uz column cvorID.
I sad bi moj upit trebao dohvatiti vrijednosti i te druge kolone.
Ovdje gdje sam zacrvenio…tu ga znam dohvatiti…ali neznam kako do koraka koji stoji uz cvor 13??

[quote=""]
SELECT podatakID, [color="#FF0000"]korak[/color] FROM podatakImaCvor WHERE cvorID=17 AND podatakID IN (SELECT podatakID FROM podatakImaCvor WHERE cvorID=13);[/quote]

EDIT: lol, ponovio sam gornji upit …a zaboravio da sam to već pitao xd. Somebody help!! :slight_smile:

probaj ovako:

Ukoliko imaš malo takvih podataka i njihovih vrijednosti, bolje ti je to riješiti algoritamski. Rješavati to relacionom algebrom je dobra vježbalica za mozak, ali “inžinjerski” gledano, radi se više o algoritamskom problemu.

[hr][/hr]

Neka imaš tablicu s podacima:

DATA_SET := { ID+, VALUE+ }

Neka imaš tablicu sa skupom koji tražiš:

SEARCH_SET := { ID+, VALUE+ }

U gornjem zapisu su s “+” označena polja primarnog ključa, izabranog tako da garantira pretpostavku zadatka o neponovljivosti.

Neka je slijedeće primjer tablice s podacima:

DATA_SET
ID |  VALUE
---+-------
1  |  2
1  |  3
1  |  4
1  |  9
1  |  13
1  |  17
1  |  21
1  |  54
2  |  7
2  |  12
2  |  13
2  |  14
2  |  17
2  |  25
2  |  26
2  |  36
2  |  45
2  |  54
2  |  59
2  |  72
2  |  84
3  |  2
3  |  4
3  |  9
3  |  13
3  |  17
3  |  21
3  |  44
3  |  54
3  |  78
4  |  5
4  |  17
4  |  21
4  |  45

Neka je slijedeće primjer tablice s podacima koji se traže:

SEARCH_SET
ID |  VALUE
---+-------
A  |  13
A  |  17
B  |  36
B  |  59
B  |  84
C  |  45

Onda slijedeći upit Q1:

SELECT
    OUTER_SEARCH_SET.ID AS S
  , DATA_SET.ID AS D
FROM
    SEARCH_SET OUTER_SEARCH_SET
    INNER JOIN
    DATA_SET 
    ON
        OUTER_SEARCH_SET.VALUE = DATA_SET.VALUE
GROUP BY
    OUTER_SEARCH_SET.ID
  , DATA_SET.ID
HAVING
    COUNT(*) = (
        SELECT 
            COUNT(*) 
        FROM 
            SEARCH_SET INNER_SEARCH_SET 
        WHERE 
            INNER_SEARCH_SET.ID = OUTER_SEARCH_SET.ID
        )
  ;

daje slijedeći rezultat:

Q1
S  |  D
---+----
A  |  1
A  |  2
A  |  3
B  |  2
C  |  2
C  |  4

Drugi dio zadatka nije moguće riješiti jer je zadatak nedostatno specificiran. Primjerice, ako se traže brojevi A i B, koji skup je bolji?

1 -> A, n, n, B, n
2 -> n, A, n, n, B
3 -> A, B, n, n, n
4 -> n, n, n, B, A

Zadatak se može precizno specificirati zadavanjem težinske funkcije, gdje će se svakom podatku skupa pridružiti težinski faktor, a potom korištenjem kumulativne funkcije izračunati ukupna “težina” svakog rezultata pretraživanja.

@System32
bojim se da nece tako ici…ne prihvaca mi definiranje u ugnjezdenom selectu. …a jos k tome bi ja u tom drugom selectu trebao dohvacati vise parametara, a onda se komplet sve raspadne jer vise ni upit nije valjan.

@tsereg

Zasto ga zakomplicira :slight_smile:

…zasto bi pretragu radio iz tablice? Podatak za pretragu mi je definiran samo s dvije varijable, recimo x=13 i y=17.
U podatak koji pretrazujem moram zapisati jos jednu kolonu. “korak”

DATA_SET
ID |  VALUE  |  KORAK
---+-------
1  |  2        |  1
1  |  3        |  2
1  |  4        |  3
1  |  9        |  4
1  |  13        |  5
1  |  17        |  6
1  |  21        |  7
1  |  54        |  8
2  |  7        |  1
2  |  12        |  2
2  |  13        |  3
2  |  14        |  4
2  |  17        |  5
2  |  25        |  6
2  |  26        |  7
2  |  36        |  8
2  |  45        |  9
2  |  54        |  10
2  |  59        |  11
2  |  72        |  12
2  |  84        |  13
3  |  2        |  1
3  |  4        |  2
3  |  9        |  3
3  |  13        |  4
3  |  17        |  5
3  |  21        |  6
3  |  44        |  7
3  |  54        |  8
3  |  78      |  9
4  |  5        |  1
4  |  17        |  2
4  |  21        |  3
4  |  45        |  4

E sad, pomocu tog koraka mogu kasnije analizirati koji rezultat mi je bolji. Iako bi za taj korak mogao poslužiti i row_id, neka ostane korak.

Za pretragu x=13,y=17 rezultat bi trebao izgledati ovako:

rezultati:

  1. podatakID=1, korak1=5 (tamo gdje je vrijednost bila 13), korak2=6 (tamo gdje je vrijednost bila 17)
  2. podatakID=2, korak1=3, korak2=5
    3.podatakID=3, korak1=4,korak2=5

E sad, u nekoj drugoj tablici imam kolone koje su vezane uz taj isti podatakID…i te kolone također trebam dohvatiti kao značajke koje čine kompletan rezultat pretrage.
Ono što me trenutno najviše zanima…ne da mi složiš upit koji će mi sve dohvatiti, nego koliko je bitno da jedan SQL upit dohvati sve potrebne podatke? Jel bitna razlika izmedju toga i recimo načina da s jednim upitom dohvatim sve ID-ove podataka,(kao što ih tvoj rezultat daje)…i tek onda da napravim drugi upit koji će dohvatiti ostale potrebne podatke iz drugih tablica vezane uz te iste ID-ove.

…a ovo si u pravu da je nedefinirano…iako bi se to mogle smatrati jednako kvalitetni rezultati. Ali to mi nije bas ni bitno da je odmah sortirano, kad mogu kasnije preko koraka na klijent strani raditi sto hocu (tamo mi ne pada na pamet razmisljati o optimizaciji xd)

Inače samo ću reći da si ga sa svojim objašnjavanjem zakomplicirao do boli, pa sad na kraju uopće nemam pojma koji su tvoji problemi i ne da mi se s njima sad razbijati glavu, ali mi je ova ostavljena rečenica jako zanimljiva. Može li samo kratko objašnjenje te tvoje rečenice, iako to odlazi u Off topic.

Pa moguce da sam ga zakomplicirao…štovise vjerovatno xd. …i netreba se zato nitko mučiti da me dešifrira, hvala svejedno. (Snašao sam se ja već nekako, zasad)

Paa…želim da su mi SQL upiti što optimiziraniji i sve ostalo što se izvršava na server strani (moje želje i vizije u picajliziranju su često dosta iznad moga znanja…pa malo lupam po shortcutevima umjesto da učim…).
S druge strane one obrade podataka (u ovom slučaju sortiranje podataka prema “koraku”) …koje mogu ostaviti da se izvršavaju na client strani, me uopće ne zanemarivaju previše koliko su optimizirane.

Razlog je valjda više nego očit…client side, jedno računalo jedan korisnik, dok server side mora usluzit n*korisnika.

P:S. i nemoj me bukvalno shvatiti. “Ne razmišljati” mi znači “NE picajlizirati”

Tamo sam zakomplicirao…ali sad imam novi primjer na kojem cu ljepse moci definirati ono sto me zanima.
Imam isti problem kao i ovaj: mysql subquery and having max value of subquery - Stack Overflow

Osim što me zanima ima li netko ljepse rjesenje od tamo ponudjenih, zanima me i koje su mane ovakvog pristupa:

Recimo napravim select gdje ću dohvatiti sve različite “plaka”

“SELECT plaka FROM party_sehir GROUP BY plaka “;
…i sve rezultate spremim u listu.
Zatim napraviti više novih upita, za svaki pojedinačni član liste:
foreach($list as $val)
{
“SELECT * FROM party_sehir WHERE plaka=.”$val”. ORDER BY i DESC LIMIT 1”;
…//jel to loš pristup??
}

“GROUP BY” i “ORDER BY” možeš odmah zejedno koristiti, ne razumijem zašto bi odvojeno to radio?

upit:
“SELECT plaka,i FROM party_sehir GROUP BY plaka ORDER BY i DESC”;

…nece grupirati podatke prema onoj liniji gdje je “i” najveći…nego će napraviti identično grupiranje kao i da nema ordera…te ce tek nakon toga dobivene podatke poredati prema vec dohacenom “i”. Što znači da je unutar neke grupe “i” mogao biti i veći nego je na kraju dobiven.

[quote=“bozoou”]upit:
“SELECT plaka,i FROM party_sehir GROUP BY plaka ORDER BY i DESC”;

…nece grupirati podatke prema onoj liniji gdje je “i” najveći…nego će napraviti identično grupiranje kao i da nema ordera…te ce tek nakon toga dobivene podatke poredati prema vec dohacenom “i”. Što znači da je unutar neke grupe “i” mogao biti i veći nego je na kraju dobiven.[/quote]

Ovaj upit nije ispravan.
U GROUP BY moraju biti navedena sva ne-agregatna polja koja se navedena u SELECT dijelu.

Nisam pohvatao nit problema, ali mi se nekako čini da je ovdje GROUP BY suvišan jer se ništa ne treba grupirati, samo sortirati.
Treba prikazati SVE retke jedne tablice, sortirano po dva polja. (?)

Nabadam:
SELECT * FROM party_sehir ORDER BY plaka ASC, i DESC

Nope…pogledaj link koji sam dao…
mysql subquery and having max value of subquery - Stack Overflow

…covjek je kratko i jasno i slikovito objasnio problem…koji ja djelim s njim. Samo eto ja imam mrvicu i kompleksniju stvar, pa bi rado razdvajao upite…i cisto me zanima koje su mane razdvajanja?
Umjesto da sve strpam u jedan upit, ja bi s prvim upitom dohvatio jedinstvene vrijednosti prema odredjenoj koloni. …a tek onda bi prema tim jedinstvenim vrijednostima tražio maximalnu vrijednost (koja je kod njega “i”)…s tim da kad ja nadjem te maksimalne vrijednosti još moram pomoću JOIN-a dohvaćati odredjene podatke i iz drugih tablica, koje će biti povezane preko odredjenih kolona s tim redovima gdje se nalaze te maksimalne vrijednosti.

Nisam gledao link, sorry :frowning:

Trebalo bi se korisiti TOP 1 i DESC ORDER…

Idem malo pročačkati…


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja