» »

[mySQL] Malo bolj kompliciran query :)

[mySQL] Malo bolj kompliciran query :)

Old Spice ::

Takole imam dve tabeli (relacija 1:N):

Prva tabela ima med drugim te stolpce:

1) id
2) ime
3) lastnik
4) datum

Druga tabela pa ima:

1) id (SKUPEN obema tabelama, zaradi relacije)
2) id2 (torej svoj id, v tem primeru za nas nezanimiv)
2) opis
3) datum

Sedaj pa, na podlagi iskanega niza moram poiskati rezultate v obeh tabelah in sicer v stolpcih, ki so odebeljeni.

Če torej iščem niz "bla bla" mora query poiskat ali se s tem ujema v prvi tabeli stolpec "ime" ali "lastnik" IN ali se v drugi tabeli ujema s tem nizom "opis". Tam kjer se to ujema naj vrne ta skupen "id".

Nekako tako: "SELECT id FROM tabela_ena WHERE ime LIKE 'bla bla' OR lastnik LIKE 'bla bla' UNION SELECT id FROM tabela_dva WHERE opis LIKE 'bla bla'"

Query torej vrne "id-je" vseh tistih vnosov v tabelah, ki se ujemajo z iskanim nizom ("id" pa je skupen obema tabelama). Težava je, med drugim tu, da se "id-ji" ponavljajo.

Zdaj se pa nekoliko zakomplicira. Kar bi jaz potreboval je query, ki pogleda v prvi tabeli ali se "ime" ali "lastnik" ujema z iskanim nizom IN hkrati da je "ime" enako spet nekemu drugemu iskanemu nizu (se pravi nekemu definiranemu imenu). Hkrati pa naj vrne še rezultate (se pravi "id-je") iz druge tabele če se slučajno "opis" ujema z iskanim nizom AMPAK naj ga vrne samo če se "id" v tej vrstici v drugi tabeli ujema z iskanim "imenom" pri tem "id-ju" v prvi tabeli.

Upam da sem v redu obrazložil. Vsakdo, ki ima kak nasvet se priporočam. =)

ales85 ::

Če sem pravilno razumel rabiš v tvojem prvotnem stavku še dodatni pogoj AND id IN (rezultati iz druge tabele). V tem primeru ti bo stavek izpisal samo tiste id-je, ki se pojavljajo v prvem stavku, hkrati pa nastopajo tudi v drugem. Elemente lahko gnezdiš med stavki in jih uporabljaš kombinirano.

EDIT: Rezultati iz druge tabele v oklepaju pomeni, da vpišeš notri drugi stavek.

EDIT2: SELECT id FROM tabela_ena WHERE ime LIKE 'bla bla' OR lastnik LIKE 'bla bla' UNION SELECT id FROM tabela_dva WHERE opis LIKE 'bla bla' AND id IN (SELECT id FROM tabela_dva WHERE opis LIKE 'bla bla'

Zgodovina sprememb…

  • spremenil: ales85 ()

Old Spice ::

V bistvu bi rabil takole:

Niz ki ga iščem: bla bla
Lastnik: janez

*Prvi del: SELECT id FROM tabela_ena WHERE ime LIKE 'bla bla' AND lastnik='janez'

UNION

*Drugi del:

SELECT id FROM tabela_dva WHERE opis LIKE 'bla bla' AND lastnik='janez'

Težava, ki jo imam tu je ta da ne vem kaj naj naredim da bo tudi druga tabela upoštevala tega Janeza, ki pa je zapisan samo v prvi tabeli. V bistvu bi pri drugi tabeli moral pogledati ali se "opis" ujema z "bla bla", če se "opis" ujema, poglej kakšen "id" ima ta vrstica v tej drugi tabeli in preveri ali "lastnik", ki je vpisan v prvi tabeli pod tem "id-jem" tudi "janez". Če to drži ga vrni, sicer pa vrstico preskoči.

Zgodovina sprememb…

Mesar ::

SELECT tabela_dva.id FROM tabela_ena, tabela_dva WHERE tabela_ena.id = tabela_dva.id AND tabela_dva.opis LIKE 'bla bla' AND tabela_ena.lastnik='janez'

evo, da bo cist simple pa razumljivo :)
Your turn to burn!

Zgodovina sprememb…

  • spremenil: Mesar ()

darkkk ::

Lahko probaš inner join-at tabele na nečem in potem selectat ven kar rabiš.

(res nisem dobro razumel, kaj hočeš narest)

Mesar ::

Jaz tudi ne, samo 2 query sem mu popravil :D
Your turn to burn!

Old Spice ::

OK. Hvala vsem trem, mislim da bo tale od Mesarja query primeren. Grem probat implementirat ... =)

ales85 ::

Samo nasvet, drugič priloži k vprašanju še vzorčne tabele s podatki (do 5 vrstic), da bo lažje razumeti na dejanskem primeru kaj želiš.

Old Spice ::

Hvala deluje :)

Imam pa še eno vprašanje. Sedaj bi rezultat iz teh dveh tabel rad sortiral z ORDER BY glede na podatke v prvi tabeli.

Recimo da ta rezultat, ki ga zgornji query vrne sortiram po "ime-nu" ali "lastnik-u" kateri pa je samo v prvi tabeli. Uporabil sem spodnji query.

SELECT * FROM
(
query_1
UNION
query_2
)result
ORDER BY ime ASC

Očitno to ne deluje kot sem mislil. Ali kdo ve zakaj to ne deluje. Mogoče zato ker "ime-na" in "lastnik-a" ni v drugi tabeli?

Mesar ::

Old Spice> Očitno to ne deluje kot sem mislil. Ali kdo ve zakaj to ne deluje. Mogoče zato ker "ime-na" in "lastnik-a" ni v drugi tabeli?

Tako nekako, lahko ga imaš tam preko inner joina, vendar se na ta podatek več ne moreš upirat ko je vse skupaj enkrat v uniji. Lahko pa bi poskusil kaj takeg...

SELECT id, ime, lastnik FROM tabela_ena WHERE ime LIKE 'bla bla' AND lastnik = 'janez'

UNION

SELECT tabela_dva.id, tabela_ena.ime, tabela_ena.lastnik FROM tabela_ena, tabela_dva WHERE tabela_ena.id = tabela_dva.id AND tabela_dva.opis LIKE 'bla bla' AND tabela_ena.lastnik='janez'

In potem dobiš 3 podatke na vrstico (id iz tabele ena ali dva, ustrezno ime in ustreznega lastnika) in lahko potem delaš ORDER BY na lastnik in/ali ime. Podatke lahko sortiraš tudi preden so v uniji ampak to ti bo sortiralo podatke iz prve tabele in potem podatke iz druge tabele... ter dalo ene "za" druge... česar verjetno ne iščeš.
Your turn to burn!

Old Spice ::

Aha tako pa deluje. Hvala. Jaz sem probaval z "Null as" pa ni glih dobro delalo =)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

MS Access (strani: 1 2 )

Oddelek: Programiranje
647063 (5121) travica
»

[SQL] PgAdmin preprosto vprasanje povezano s stolpci v tabeli

Oddelek: Programiranje
222108 (1467) Cvele2011
»

MYSQL vprašanje

Oddelek: Programiranje
131665 (1280) MrBrdo
»

[SQL] - unique id-ji iz seznama, ki jih ni v tabeli?

Oddelek: Programiranje
9948 (876) krho
»

Kaj je narobe tu...(php)

Oddelek: Programiranje
51127 (1025) teac

Več podobnih tem