[MySQL] Probleem met LIKE in query

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

  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Ik ben bezig met een query die de gegeven van 2 tabellen ophaalt, waarbij 2 velden met een LIKE vergeleken moeten worden.

Ik krijg dit niet voor elkaar, wat ik ook probeer.

Het laatst deel van de query moet er zo uitzien:

AND title LIKE '%naam van veld%'

Wat ik ook probeer met quote's, + &,of wat voor teken dan ook, het werkt gewoon niet.

Als ik gewoon direct een bepaad woord erin zet, dan werkt de query prima,als volgt:

AND title LIKE '%tweakers%'

Maar bij "tweakers" moet er dus simpelweg verwezen worden naar een veld uit de database.

Iemand een idee ?

Pay peanuts get monkeys !


  • Vaudtje
  • Registratie: April 2002
  • Niet online
SQL:
1
LIKE '%' | naamVeld | '%'

Je moet de naam van het veld buiten de quotes houden. Heb je dat geprobeerd?

Als hij die syntax niet snapt, kun je de procentjes er omheen concateneren:
SQL:
1
LIKE concat(concat('%', naamVeld), '%')

[ Voor 37% gewijzigd door Vaudtje op 26-04-2007 11:29 ]

In deeze zin staan drie fauten


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Vaudtje schreef op donderdag 26 april 2007 @ 11:03:
code:
1
LIKE '%' | naamVeld | '%'

Je moet de naam van het veld buiten de quotes houden. Heb je dat geprobeerd?

Als hij die syntax niet snapt, kun je de procentjes er omheen concateneren:
code:
1
LIKE concat(concat('%', naamVeld), '%')
ehrm... maak daar maar van:
SQL:
1
LIKE concat('%', naamVeld, '%')

  • Vaudtje
  • Registratie: April 2002
  • Niet online
Edwardvb schreef op donderdag 26 april 2007 @ 11:24:
[...]
ehrm... maak daar maar van:
Ik heb hier alleen DB2 om te testen, die lust slechts twee argumenten per concat :P .
Het gaat om het idee :)

In deeze zin staan drie fauten


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Die laatse laat in ieder geval geen foutmeldingen zien, maar ik krijg maar geen resultaten.

De huidige query:

code:
1
Select gebruikerid, gebruikeridf, zoekopdracht, title from Zoeken, Import, Gebruikers where GebruikerID = GebruikerIDF AND title LIKE concat('%', zoekopdracht, '%')


Echter als ik direct het enige zoekwoord uit het veld "zoekopdracht" erin plaats, dan krijg ik wel resultaat:

code:
1
Select gebruikerid, gebruikeridf, zoekopdracht, title from Zoeken, Import, Gebruikers where GebruikerID = GebruikerIDF AND title LIKE '%tweakers%'


Hoe kan dit ?

Pay peanuts get monkeys !


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Omdat die tweede query een join op tabel Zoeken zonder condities is, waardoor alle rijen getoond worden (cartesisch product)?

[ Voor 10% gewijzigd door Vaudtje op 26-04-2007 11:45 . Reden: terminologie gefixt ]

In deeze zin staan drie fauten


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
leg eerst je tabellen-structuur eens uit, want ik snap er eerlijk gezegd geen drol van wat je nu eigenlijk wilt....

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 01-12 13:02

Dido

heforshe

Beiden zijn in dat opzicht gelijk, maar genereren een cartesiaans product... ik zou, los van de like-problemen, ook maar wat join-voorwaarden opgeven :)

Wat betekent mijn avatar?


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 17-10 21:51

VisionMaster

Security!

Dido schreef op donderdag 26 april 2007 @ 11:46:
Beiden zijn in dat opzicht gelijk, maar genereren een cartesiaans product... ik zou, los van de like-problemen, ook maar wat join-voorwaarden opgeven :)
Ik denk dat je 'zou' mag vervangen in 'moet'? ;)

edit2: Trouwens, waarom noem je dat in je like statement %naam van veld%? Hoe bedoel je 'naam van veld'?

[ Voor 17% gewijzigd door VisionMaster op 26-04-2007 11:50 ]

I've visited the Mothership @ Cupertino


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Vaudtje schreef op donderdag 26 april 2007 @ 11:42:
[...]

Omdat die tweede query een full outer join op tabel Zoeken is, waardoor alle rijen getoond worden?
Er wordt helemaal niets getoond.

Goed, ik heb een tabel "Gebruikers" waar op dit moment data instaat van 1 gebruiker. ID, emailadres, etc.

Verder heb ik een tabel "Zoeken" waar het id in vermeld staat van de gebruiker, tezamen met het veld "Zoekopdracht" In dat veld staat een zoekwoord.

Tot slot heb ik een tabel "Import" met het veld "title". Er staan honderd records in die tabel. In het veld "title" staan hele zinnen. In 2 records komt het woord voor uit het veld "Zoekopdracht". Ikmoet dus 2 records terugkrijgen met mijn query. Iets dat prima lukt, als ik direct het woord in de query plaats.

Ik denk dat ik uiteindelijk de Full text searching van MySQL ga gebruiken, omdat dit sneller werkt, maar wil eerst dit even werkend hebben.

Pay peanuts get monkeys !


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 17-10 21:51

VisionMaster

Security!

Dutch_guy schreef op donderdag 26 april 2007 @ 11:50:
[...]
Er wordt helemaal niets getoond.

Goed, ik heb een tabel "Gebruikers" waar op dit moment data instaat van 1 gebruiker. ID, emailadres, etc.

Verder heb ik een tabel "Zoeken" waar het id in vermeld staat van de gebruiker, tezamen met het veld "Zoekopdracht" In dat veld staat een zoekwoord.

Tot slot heb ik een tabel "Import" met het veld "title". Er staan honderd records in die tabel. In het veld "title" staan hele zinnen. In 2 records komt het woord voor uit het veld "Zoekopdracht". Ikmoet dus 2 records terugkrijgen met mijn query. Iets dat prima lukt, als ik direct het woord in de query plaats.

Ik denk dat ik uiteindelijk de Full text searching van MySQL ga gebruiken, omdat dit sneller werkt, maar wil eerst dit even werkend hebben.
Ik hoop dat je geen search engine aan het onwikkelen bent, want dit lijkt me niet een geweldig design om iets nuttige te zoeken :)

I've visited the Mothership @ Cupertino


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Uit je beschrijving haal ik nu de volgende query (let op de aliassen):
SQL:
1
2
3
4
SELECT *
FROM gebruiker g, import i, zoeken z
WHERE g.GebruikerID = z.GebruikerIDF
AND i.title LIKE '%bla%'

Dit levert ook een cartesisch product op, in dit geval met de Import tabel.
Welke relaties zijn er nou precies tussen de tabellen?

[ Voor 9% gewijzigd door Vaudtje op 26-04-2007 12:15 ]

In deeze zin staan drie fauten


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
VisionMaster schreef op donderdag 26 april 2007 @ 11:52:
[...]

Ik hoop dat je geen search engine aan het onwikkelen bent, want dit lijkt me niet een geweldig design om iets nuttige te zoeken :)
En hoe zou het dan moeten wat ik wil ? Het is toch niet raar wat ik probeer te bereiken ? Indien wel, dan hoor ik graag hoe ik zoiets wel moet aanpakken. :)

Uiteindelijk wil ik met de query op het scherm tonen welke titels (uit het veld "title") er gevonden zijn met het zoekwoord van iemand. Dat kan toch alleen maar op deze manier bereikt worden ? Als ik de query iets verander zodat deze de invoer van een veld van een formulier gebruikt, dan werkt het prima, waarom dan niet direct vanuit een opgeslagen woord uit een andere tabel ?

Pay peanuts get monkeys !


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 01-12 13:02

Dido

heforshe

Omdat je om te beginnen al helemaal niet in je query zet welk zoekwoord je uit die tabel wilt halen, misschien?

Heb je ook al even gekeken wat een cartesisch product inhoudt? Want die LIKE is echt het allerkleinste probleem in je query ;)

Wat betekent mijn avatar?


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Maar ik zet als zoekwoord toch neer de waarde uit het veld "zoekopdracht" ?

Pay peanuts get monkeys !


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 01-12 13:02

Dido

heforshe

Dutch_guy schreef op donderdag 26 april 2007 @ 13:55:
Maar ik zet als zoekwoord toch neer de waarde uit het veld "zoekopdracht" ?
Welk veld zoekopdracht?
Uit welk record?
Als je straks 1000 records in die tabel hebt, welke wil je dan gebruiken?

Wat betekent mijn avatar?


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Dutch_guy schreef op donderdag 26 april 2007 @ 13:00:
[...] Als ik de query iets verander zodat deze de invoer van een veld van een formulier gebruikt, dan werkt het prima, waarom dan niet direct vanuit een opgeslagen woord uit een andere tabel ?
Omdat het vervangen van de verwijzing naar kolom zoeknaam door een hardcoded text tot gevolg heeft dat je tabel een full join wordt tussen (Gebruiker + Zoeken) en Import.

De query die ik hierboven beschreef geeft voor elke combinatie van (g.GebruikerID = z.GebruikerIDF) een rij, en herhaalt dat voor alle rijen waarvan toevallig de hardcoded gezochte tekst in de Import tabel staat.

Je kunt dit testen door een combinatie van gebruiker/zoeken toe te voegen met een volkomen andere zoekopdracht. Deze zal ook geretourneerd worden.

edit:
probeer het anders eens met een = ipv LIKE, om dat probleem iig uit te sluiten (dan moet je dus z.zoekopdracht ff aanpasen).

[ Voor 7% gewijzigd door Vaudtje op 26-04-2007 14:08 ]

In deeze zin staan drie fauten


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Dido schreef op donderdag 26 april 2007 @ 13:58:
[...]

Welk veld zoekopdracht?
Uit welk record?
Als je straks 1000 records in die tabel hebt, welke wil je dan gebruiken?
Ik neem aan dat Dutch_guy bedoelt de losse zoekwoorden per gebruiker op te slaan. Hij wil dus zoeken in de Import tabel op alle woorden die in de Zoeken tabel voorkomen bij de huidige gebruiker. Klopt dat ongeveer?

SQL:
1
2
3
4
5
SELECT *
FROM gebruiker g, import i, zoeken z
WHERE g.GebruikerID = z.GebruikerIDF
AND i.title LIKE concat('%', z.zoekopdracht, '%')
AND g.GebruikerId = ?

Het lijkt me dat dat inderdaad zou moeten werken.

[ Voor 20% gewijzigd door Vaudtje op 26-04-2007 14:13 ]

In deeze zin staan drie fauten


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Toch krijg ik met deze query: Select gebruikerid, gebruikeridf, zoekopdracht, title from Zoeken, Import, Gebruikers where GebruikerID = GebruikerIDF AND title LIKE '%tweakers%'

netjes wat ik wil hebben:

gebruikerid | zoekopdracht | title
1 | tweakers | Tweakers is een forum
1 | tweakers | 100.000ste tweaker geregistreerd

Is dit wat jullie bedoelen met een "cartesisch product" ?

Dit is wel wat ik precies wil hebben, want nu kan ik met een loopje in mijn ASP script voor deze gebruiker de Titles tonen.

Pay peanuts get monkeys !


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Vaudtje schreef op donderdag 26 april 2007 @ 14:10:
[...]

Ik neem aan dat Dutch_guy bedoelt de losse zoekwoorden per gebruiker op te slaan. Hij wil dus zoeken in de Import tabel op alle woorden die in de Zoeken tabel voorkomen bij de huidige gebruiker. Klopt dat ongeveer?
Exact !

Pay peanuts get monkeys !


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Ik heb in mijn beide bovenstaande posts hevig geedit, sorry.
Heb je al resultaten van het toevoegen van een nieuwe gebruiker?

edit:
Kan het niet laten te editen ;)
Je eigen resultaten laten volgens mij al zien dat er iets niet klopt.
Geen van beide gevonden rijen zijn een match op '%tweakers%', want de ene matcht niet op case en de andere mist een s :?

[ Voor 53% gewijzigd door Vaudtje op 26-04-2007 14:18 ]

In deeze zin staan drie fauten


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 17-10 21:51

VisionMaster

Security!

Vaudtje schreef op donderdag 26 april 2007 @ 14:14:
Ik heb in mijn beide bovenstaande posts hevig geedit, sorry.
Heb je al resultaten van het toevoegen van een nieuwe gebruiker?

edit:
Kan het niet laten te editen ;)
Je eigen resultaten laten volgens mij al zien dat er iets niet klopt.
Geen van beide gevonden rijen zijn een match op '%tweakers%', want de ene matcht niet op case en de andere mist een s :?
Je edits hebben me nu pas laten realiseren wat de vraag van de TS nou is. Ik snapte er geen hout van en het was gewoon fout uitgelegd en fout uitgewerkt, maar goed... een aantal edits verder wordt het duidelijker.

I've visited the Mothership @ Cupertino


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Vaudtje schreef op donderdag 26 april 2007 @ 14:14:
Ik heb in mijn beide bovenstaande posts hevig geedit, sorry.
Heb je al resultaten van het toevoegen van een nieuwe gebruiker?

edit:
Kan het niet laten te editen ;)
Je eigen resultaten laten volgens mij al zien dat er iets niet klopt.
Geen van beide gevonden rijen zijn een match op '%tweakers%', want de ene matcht niet op case en de andere mist een s :?
Het is juist de bedoeling dat die resultaten er bij staan, anders had ik geen LIKE hoeven te gebruiken.

Pay peanuts get monkeys !


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

'100.000ste tweaker geregistreerd' LIKE '%tweakers%'
levert false op. Hij zou dus ook niet terug moeten kunnen komen in je resultaat. Zet gewoon eens wat meer data in je database, dan is het misschien wat duidelijker te zien.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Janoz schreef op donderdag 26 april 2007 @ 14:30:
'100.000ste tweaker geregistreerd' LIKE '%tweakers%'
levert false op. Hij zou dus ook niet terug moeten kunnen komen in je resultaat. Zet gewoon eens wat meer data in je database, dan is het misschien wat duidelijker te zien.
Dat zei ik hierboven in mijn edit :P
Zie ook cartesisch product op Wikipedia (onderaan staat SQL context uitgelegd).
Een gerelateerde term is de full join

In deeze zin staan drie fauten


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 01-12 13:02

Dido

heforshe

Dutch_guy schreef op donderdag 26 april 2007 @ 14:12:
Is dit wat jullie bedoelen met een "cartesisch product" ?
Je had ook even op dit linkje kunnen klikken om het antwoord te zien ;)
Ja dus, dat is naar alle waarschijnlijkheid een cartesisch product.
Dit is wel wat ik precies wil hebben, want nu kan ik met een loopje in mijn ASP script voor deze gebruiker de Titles tonen.
En dat heet nou "stom toeval". Het heeft in ieder geval niets met je "like" te maken, want daar voldoen ze niet aan, zoals al een paar keer opgemerkt.

Wat betekent mijn avatar?


  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

* KoW schreef onzin

Maare, als je naar het laatste sample van Vaudtje kijkt, werkt dat dan niet?
Zonee, probeer dan nog eens de spaties er af te halen.
(geen idee of MySQL dat standaard voor je doet, maar "tweakers " zit niet in een normaal resultaat.)
Overigens zal een like met "%tweakers%" nooit een resultaat met "tweaker " vinden.

[ Voor 191% gewijzigd door KoW op 26-04-2007 15:06 ]


  • Vaudtje
  • Registratie: April 2002
  • Niet online
KoW schreef op donderdag 26 april 2007 @ 14:58:
* KoW schreef onzin

Maare, als je naar het laatste sample van Vaudtje kijkt, werkt dat dan niet?
Zonee, probeer dan nog eens de spaties er af te halen.
(geen idee of MySQL dat standaard voor je doet, maar "tweakers " zit niet in een normaal resultaat.)
En dan dus wel zoeken naar 'weaker', dan vind je tenminste iets :D

In deeze zin staan drie fauten


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Ai,.... :/

Jullie hebben gelijk... Ik heb een paar zoekwoorden toegevoegd die geen resultaat hebben, maar toch naar voren komen in de query.

Sorry, had met meer gegevens moeten testen.

Iemand een idee hoe ik dit beter kan aanpakken?

Gebruikers hebben dus meerdere zoekwoorden in een tabel "zoeken".

In een tabel "import" staan records met daarin teksten waarin gezocht moet worden, veld "title".

Ik wil een overzicht verkrijgen waarbij alle records worden getoond waarbij de zoekwoorden een match hebben met een of meerdere records uit het veld "title".

[ Voor 40% gewijzigd door Dutch_guy op 26-04-2007 15:14 ]

Pay peanuts get monkeys !


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Vaudtje schreef op donderdag 26 april 2007 @ 14:10:
[...]
SQL:
1
2
3
4
5
SELECT *
FROM gebruiker g, import i, zoeken z
WHERE g.GebruikerID = z.GebruikerIDF
AND i.title LIKE concat('%', z.zoekopdracht, '%')
AND g.GebruikerId = ?
Daarmee voeg je een join conditie toe tussen z en i, en daarmee verdwijnt je cartesisch product.
in nieuwerwetse sql is het duidelijker te zien dat de joins nu condities hebben:
SQL:
1
2
3
4
SELECT *
FROM gebruiker g JOIN zoeken z ON g.GebruikerID = z.GebruikerIDF
JOIN import i ON i.title LIKE concat('%', z.zoekopdracht, '%')
WHERE g.GebruikerId = ?

In deeze zin staan drie fauten


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Niets, geen resultaten.

Denk dat ik echt iets verkeerd doe. Back to the drawingboard ben ik bang...

Pay peanuts get monkeys !


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Dutch_guy schreef op donderdag 26 april 2007 @ 15:51:
Niets, geen resultaten.

Denk dat ik echt iets verkeerd doe. Back to the drawingboard ben ik bang...
Je hebt wel je zoekopdracht aangepast neem ik aan? Dus niet meer zoeken naar 'tweakers' maar naar 'weaker'?

In deeze zin staan drie fauten


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Misschien vraag ik nu teveel, maar ben even teruggegaan naar Access om te testen.

Ik heb hier een testdatabase geupload: http://thinktwice.xs4all.nl/import.mdb

De query die daar staat toont dus teveel resultaten.

Misschien dat iemand zich geroepen voelt om er even naar te kijken, want ik ben het spoor bijster...

Pay peanuts get monkeys !


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 01-12 13:02

Dido

heforshe

Ik wil best even kijken, maar dat wordt vanavond :)

Wat betekent mijn avatar?


  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Als ik naar je voorbeeld kijkt heb je like "weaker" neergezet.
Dan is er dus geen link tussen je gebruiker en je import tabel.
Dan krijg je dat zogenaamde cartesisch product

Edit:
Met het idee zoals Vaudtje het aangaf werkt het direct.
Spaties wegnemen is niet eens nodig.

SQL:
1
2
3
4
SELECT zoeken.zoekopdracht, import.title, gebruikers.GebruikerID, zoeken.gebruikeridf
FROM import, gebruikers INNER JOIN zoeken ON gebruikers.GebruikerID = zoeken.gebruikeridf
WHERE (((import.title) Like "*"+zoeken.zoekopdracht+"*"))
ORDER BY gebruikers.GebruikerID;

code:
1
2
3
4
zoekopdracht    title   GebruikerID gebruikeridf
tweaker 100.000ste tweaker geregistreerd    1   1
tweaker Tweakers is een forum   1   1
tweakers    Tweakers is een forum   2   2

[ Voor 66% gewijzigd door KoW op 26-04-2007 17:02 ]


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Helemaal top !

Ontzettend bedankt iedereen, dit werkt nu perfect !

Nu nog even aanpassen voor MySQL en ik ben eruit, maar denk dat dat wel moet gaan lukken.

[ Voor 78% gewijzigd door Dutch_guy op 26-04-2007 21:19 ]

Pay peanuts get monkeys !


  • Dutch_guy
  • Registratie: September 2001
  • Laatst online: 04-11 09:21
Pffff. en na uren rommelen werkt het gewoon niet in MySQL.

Leek mij een kwestie van het stukje na "LIKE" te vervangen in: concat('%', zoeken.zoekopdracht, '%')

Mooi geen resultaat ! :(

Pay peanuts get monkeys !


  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

en met concat('%', TRIM(zoeken.zoekopdracht), '%')
:?

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 17-10 21:51

VisionMaster

Security!

Dutch_guy schreef op donderdag 26 april 2007 @ 21:19:
Pffff. en na uren rommelen werkt het gewoon niet in MySQL.

Leek mij een kwestie van het stukje na "LIKE" te vervangen in: concat('%', zoeken.zoekopdracht, '%')

Mooi geen resultaat ! :(
Let op, alleen de simpelste SQL statements zijn te gebruiken op meerdere databases, zoals Oracle, MySQL, Sybase, PostgreSQL, MS SQL en MS Access. Op het moment dat je functies gebruikt, zoals concat() en dergelijke of je gebruik bijv. JOIN, dan kan je al merken dat je verschillende effecten kan tegenkomen tussen de databases.

I've visited the Mothership @ Cupertino


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Concat zou ook netjes moeten werken in MySQL, zie bijvoorbeeld dit artikel.
Wat heb je allemaal uitgeprobeerd en uitgezocht, en wat waren de resultaten?

In deeze zin staan drie fauten

Pagina: 1