Toon posts:

[SQL] search query binnen meerder tabellen

Pagina: 1
Acties:
  • 262 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig een zoekfunctie te maken die een projectendatabase (mssql) doorzoekt naar 1 of meerdere zoektermen.
Het doorzoeken van 1 tabel, binnen opgegeven kolommen, gaat prima.
Echter zijn er een aantal gerelateerde tabellen die ook data bevatten van projecten
d.m.v. een inner join
SQL:
1
INNER JOIN stud_vardata ON stud_project.id_project = stud_vardata.id_project

De tabel stud_vardata bevat 1 of meerder records die het id_project hebben.
Als resultaat krijg ik nu dubbele records (2 als er twee records in stud_vardata staan etc.)

Hoe kan ik de tabel stud_vardata includen in de qeury zonder dat ik weet hoeveel gerelateerde records er in zitten. In de tabel stud_vardata wil ik de kolom inhoud meenemen in de qeury
Als ik de werking hiervan weet kan ik ook andere rerelateerde tabellen koppelen.

voorbeeld van de query zoals deze nu is:
SQL:
1
SELECT TOP 10 * FROM stud_project INNER JOIN stud_vardata ON stud_project.id_project = stud_vardata.id_project WHERE projectnaam LIKE '%den%' OR (inhoud LIKE '%den%' ) ORDER BY projectnaam DESC

[ Voor 8% gewijzigd door Verwijderd op 30-11-2005 14:59 . Reden: iets mooier opgemaakt ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In principe heeft dit niet zozeer met zoeken te maken, je hebt dit nu eenmaal als je tabellen joined. Je hebt een GROUP BY nodig, of een DISTINCT hoewel die laatste waarschijnlijk niet zal werken als je select * doet.

Het komt er op neer dat jij sql server moet vertellen wat je terug wilt zien in de resultset, zie ook :Hoe kom ik van "dubbele resultaten" in mijn query af? en Hoe werkt dat GROUP BY nou eigenlijk?

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Lijkt erop dat je meer dit bedoelt:
SQL:
1
2
3
4
5
SELECT TOP 10 * 
FROM stud_project 
WHERE projectnaam LIKE '%den%' OR id_project IN 
(SELECT id_project FROM stud_vardata WHERE (inhoud LIKE '%den%' ))
ORDER BY projectnaam DESC


Kleine kanttekening: een like '%...%' is gevaarlijk voor performance.

[ Voor 9% gewijzigd door Verwijderd op 30-11-2005 16:59 ]


Verwijderd

Topicstarter
Ik heb de optie van Debbus bekeken en deze lijkt goed te werken:
SQL:
1
2
3
4
5
6
7
8
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" SELECT stud_project.id_project, stud_project.id_programma, stud_project.plaats, stud_project.projectnaam, stud_programma.programmaNaam"
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" FROM stud_project INNER JOIN stud_programma ON stud_project.id_programma = stud_programma.id_programma"
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" WHERE stud_project.projectnaam LIKE '"&Vzoekterm&"' OR stud_project.projectnaam_onderschrift LIKE '"&Vzoekterm&"' OR stud_project.projectnummer LIKE '"&Vzoekterm&"' OR stud_project.provincie LIKE '"&Vzoekterm&"' OR stud_project.plaats LIKE '"&Vzoekterm&"' OR stud_project.gemeente LIKE '"&Vzoekterm&"' OR stud_project.locatie LIKE '"&Vzoekterm&"' OR stud_project.leadtekst LIKE '"&Vzoekterm&"' OR stud_project.status LIKE '"&Vzoekterm&"' OR stud_project.id_project IN"
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" (SELECT id_project FROM stud_vardata WHERE (inhoud LIKE '"&Vzoekterm&"')) OR stud_project.id_project IN"
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" (SELECT id_project FROM stud_trefwoorden WHERE (inhoud_trefwoorden LIKE '"&Vzoekterm&"')) OR stud_project.id_project IN"
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" (SELECT id_project FROM stud_project_contact WHERE (voornaam LIKE '"&Vzoekterm&"' OR achternaam LIKE '"&Vzoekterm&"' OR functie LIKE '"&Vzoekterm&"' OR organisatie LIKE '"&Vzoekterm&"')) OR stud_project.id_project IN"
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" (SELECT id_project FROM stud_links WHERE (link_titel LIKE '"&Vzoekterm&"')) OR stud_project.id_project IN"
SqlRecordProgrammaLijst = SqlRecordProgrammaLijst &" (SELECT id_project FROM stud_betrokken_partijen WHERE (url_titel LIKE '"&Vzoekterm&"' OR url_alt_tekst LIKE '"&Vzoekterm&"'))"

De gebruikter kan kiezen of deze wil zoeken alle woorden of exacte tekst:
SQL:
1
2
3
4
5
6
IF (optQueryMode = 0) THEN ' zoek woord of gedeelte van het woord
Vzoekterm = "%" & Replace(txtSearch,"'","''")& "%"
END IF
IF (optQueryMode = 1) THEN ' zoek exacte woord
Vzoekterm = Replace(txtSearch,"'","''")
END IF

De eerste optie werkt prima maar als de optie exacte tekst is geselecteerd is er geen resultaat. (deze moet er zeker wel zijn!) Zelf denk ik dat bij het weglaten van de % % de sql server denkt dat de gehele kolom de zoekterm moet bevatten. Is deze aanname correct? Zo ja: ik heb een probleem, zo nee: waarom krijg ik dan geen resultaat?

[ Voor 17% gewijzigd door Verwijderd op 06-12-2005 17:06 ]


  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 21-11-2025
letop:

if(iets = 1)
Maakt iets gelijk aan de waarde 1!

if (iets == 1)

bekijkt of iets gelijk is aan 1

  • whoami
  • Registratie: December 2000
  • Laatst online: 03-04 23:35
Maxxi schreef op dinsdag 06 december 2005 @ 17:10:
letop:

if(iets = 1)
Maakt iets gelijk aan de waarde 1!

if (iets == 1)

bekijkt of iets gelijk is aan 1
Dat hangt van de taal af.

https://fgheysels.github.io/


Verwijderd

Topicstarter
De optie voor het kiezen werkt prima, het gaat mij meer om de sql-qeury samenstelling, deze loopt ergens niet goed maar ik wil weten of mijn gedachtengang juist is of dat ik het in een andere hoek moet zoeken..

Verwijderd

Topicstarter
Na wat testen lijkt het inderdaad zo te zijn dat als ik de %% tekens weglaat voor en na de zoekterm de desbetreffende doorzoekbare velden volledig moeten bestaan uit deze term en er geen andere data erbij kan staan. het vervangen van LIKE in IN lost volgens mij dit probleem ook niet op....

Verwijderd

Topicstarter
iemand die mij in de juiste richting kan duwen..

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
ik snap niet zo goed wat je nou precies wilt weten ..

kan je dat nog eens formuleren ?

Verwijderd

Topicstarter
Waar ik naar zoek is hoe ik de query moet samenstellen zodat er gezocht wordt op de exacte zoekterm binnen opgegeven kolommen. De optie met %zoekterm% werkt maar daarnaast zoek ik naar die andere mogelijkheid. Punt is bij de provider waar het draait is geen mogelijkheid tot Full text indexing geinstalleerd en dus vervalt de optie contains(kolom, zoekterm). Als ik nu zoek met bovenstaande query dan is er geen resultaat. Ik ga er vanuit dat als ik LIKE '%zoekterm%' vervang met = 'zoekterm' de gehele inhoud van de kolom moet voldoen aan de opgegeven zoekterm. Dit is niet zoals ik het zou willen.. Hoop dat dit iets duidelijker is..

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
als je zegt:
code:
1
select * from tabel where col1 = 'hond'

dan krijg je alleen records terug waar col1 gelijk is aan hond

als je zegt:
code:
1
select * from tabel where col1 like '%hond'

dan krijg je records terug die gelijk zijn aan hond
ook krijg je records terug die eindigen op hond. (zoals bijvoorbeeld 'grote hond')

als je zegt:
code:
1
select * from tabel where col1 like '%hond%'

dan krijg je hetzelfde terug als hierboven, maar ook records waar hond in voorkomt zoals bijvoorbeeld: 'hondelul'

:)

bij mijn weten kan je idd alleen een full-text of met like 'lossere' zoektermen opgeven ...

Verwijderd

Topicstarter
kleine tussenoplossing die ik het gevonden is '% hond %' Door spaties voor en achte de zoekterm te plaatsen zoekt ie in ieder geval op het hele woord.

Verwijderd

Topicstarter
Is het gebruik van SQL CREATE VIEW een mogelijkheid om in ieder geval de query met wildcards voor en na de zoekterm te versnellen? Door een view te maken hoef ik niet in 8 gerelateerde tabellen te zoeken.
Pagina: 1