[MySQL] Zoek query over meerdere kollommen

Pagina: 1
Acties:

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Ik loop al een paar dagen met het volgende probleem in mn hoofd:

- Een tabel met oa de kolommen id, naam en serial.
- Een wens tot zoeken op meerdere woorden in de kolommen naam en serial (bv bij de zoektekst "auto 33" moeten alle records omhoog komen die auto 33 bevatten in kolom naam en/of serial (dus ook naam: auto, serial: 33, maar ook naam: blub, serial: 33 auto en andersom)

De server is MySQL en de query waar ik toch telkens op terug kom is:
code:
1
2
3
4
5
6
SELECT * FROM items 
WHERE naam LIKE '%auto%' 
   OR naam LIKE '%33% 
   OR serial LIKE '%auto%' 
   OR serial LIKE '%33%' 
GROUP BY id HAVING COUNT(id) = 2

Alleen geeft deze dus niets terug. Als ik de HAVING clausule weglaat krijg ik elk record ook maar 1 keer terug. Dit itt wat ik zou verwachten.

Wie o wie kan me hier een handje bij helpen?

If it's just us, it seems like an awful waste of space


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

wat wil je met die having dan?

Doet iets met Cloud (MS/IBM)


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Met die having clausule wil ik alle records omhoog vissen die 2 keer uit de query gepoept worden. Dus of auto in 1 van de kolommen en 33 in 1 van de kolommen heeft.

Ik bedenk me nu wel dat die approach niet helemaal goed is.. aangezien nu ook records die in beide kolommen auto hebben ook omhoog zouden komen.. en das niet wat ik wil :)

If it's just us, it seems like an awful waste of space


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Met deze query krijg je iedere row maar 1 keer terug hoor.

Het is niet zo dat wanneer de row meerdere malen met verschillende clausules in de where matcht, dat deze dan ook meedere malen in je result voorkomt.

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op dinsdag 02 april 2002 21:51 schreef thomaske het volgende:
Met deze query, krijg je iedere row maar 1 keer terug hoor, het is niet zo dat wanneer de row meerdere malen met verschillende clausules in de where matcht, dat deze dan ook meedere malen in je result voorkomt.
grmbl.. ja.. je hebt helemaal gelijk... back to the drawing board

If it's just us, it seems like an awful waste of space


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Op dinsdag 02 april 2002 21:52 schreef HurrI het volgende:
[..]
grmbl.. ja.. je hebt helemaal gelijk... back to the drawing board
da's misschien niet nodig hoor.. Ik bedoel ermee te zeggen dat die HAVING totaal overbodig is.
Het zou volgens mij gewoon werken, hoe je het nu doet (maar dan zonder HAVING)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op dinsdag 02 april 2002 21:56 schreef thomaske het volgende:

[..]

da's misschien niet nodig hoor.. Ik bedoel ermee te zeggen dat die HAVING totaal overbodig is.
Het zou volgens mij gewoon werken, hoe je het nu doet (maar dan zonder HAVING)
dan krijg ik alle records omhoog die voldoen aan 1 van de criteria. dus ook de records die auto hebben in 1 van de kolommen maar geen 33.

Ik kan dit ook oplossen dmv meerdere query's en dan in mn scripting (PHP in dit geval) de results evalueren. Maar aangezien het een erg forse database is (ruim 16000 records) op een net zo NIET forse server is wil ik de schade zo beperkt mogelijk houden.

If it's just us, it seems like an awful waste of space


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Op dinsdag 02 april 2002 21:59 schreef HurrI het volgende:

[..]

dan krijg ik alle records omhoog die voldoen aan 1 van de criteria. dus ook de records die auto hebben in 1 van de kolommen maar geen 33.
hmm, ik begreep uit je eerste post dat je dat juist wilde..

[edit] Na wat aandachtig lezen, kom ik uit op het volgende:
je zoekt op auto en 33, je wilt dus alle records welke beide termen bevatten, ongeachte in welk(e) veld(en)..

dat moet op te lossen zijn met een wat gecompliceerdere query hoor..

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op dinsdag 02 april 2002 22:00 schreef thomaske het volgende:

[..]

hmm, ik begreep uit je eerste post dat je dat juist wilde..
In dat geval sorry voor de misleiding.. maar het resultaat moet voldoen aan beide zoek criteria (Anders zou het geen goede zoek functie zijn :P)

If it's just us, it seems like an awful waste of space


  • MikeN
  • Registratie: April 2001
  • Laatst online: 20:25
Is de Mysql Fulltext search niet wat voor je? Misschien dat het daar makkelijker mee lukt, die bied sinds versie 4.0.1alpha (:o) ook ondersteuning voor ingebouwde boolean expressies.

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

dat moet op te lossen zijn met een wat gecompliceerdere query hoor..
je moet dus alle mogelijkheden beschrijven:

- beide termen in naam
- beide termen in serial
- één term in naam, andere term in serial
- één term serial, andere term in naam

De query moet je maar zelf verzinnen, da's een eitje nu.. ;)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op dinsdag 02 april 2002 22:07 schreef thomaske het volgende:

[..]

je moet dus alle mogelijkheden beschrijven:

- beide termen in naam
- beide termen in serial
- één term in naam, andere term in serial
- één term serial, andere term in naam

De query moet je maar zelf verzinnen, da's een eitje nu.. ;)
knikje.. op deze weg was ik inmiddels geslagen... wat ik mij echter afvraag.. bij het gebruik van een zoektekst van zeg 5 worden wordt de where clausule wel heeeeeel erg groot.. levert dit niet performance probs op?

If it's just us, it seems like an awful waste of space


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op dinsdag 02 april 2002 22:05 schreef MikeN het volgende:
Is de Mysql Fulltext search niet wat voor je? Misschien dat het daar makkelijker mee lukt, die bied sinds versie 4.0.1alpha (:o) ook ondersteuning voor ingebouwde boolean expressies.
De wereld wordt een stuk vrediger bij de komst van mysql 4 :) lekker subselecten... transaction rollbacks.. hmmm... cann't wait... maar in productie omgevingen kan je nog ff niet aankomen met alpha 's ;)

If it's just us, it seems like an awful waste of space


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Voor de volledigheid en de waarde van TFS hier de query voor mn voorbeeld:
code:
1
2
3
4
5
6
SELECT * FROM items 
WHERE actief = '1' 
 AND ((naam LIKE '%auto%' AND naam LIKE '%33%') 
   OR (naam LIKE '%auto%' AND serial LIKE '%33%') 
   OR (naam LIKE '%33%' AND serial LIKE '%auto%') 
   OR (serial LIKE '%33%' AND naam LIKE '%auto%'))

Thx voor de input ppz

If it's just us, it seems like an awful waste of space


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Eerst de velden waarop je wilt kunnen selecteren aan elkaar concateneren (eventueel met een scheidingsteken) en dan daarop de LIKE's gebruiken voor ieder woord waarop je wilt checken met AND's ertussen. Simpel en minstens zo snel.
Een index kan je toch niet gebruiken, dus het wordt een full tabel scan.

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op dinsdag 02 april 2002 22:33 schreef Goodielover het volgende:
Eerst de velden waarop je wilt kunnen selecteren aan elkaar concateneren (eventueel met een scheidingsteken) en dan daarop de LIKE's gebruiken voor ieder woord waarop je wilt checken met AND's ertussen. Simpel en minstens zo snel.
Een index kan je toch niet gebruiken, dus het wordt een full tabel scan.
Dit klinkt ook zeker niet gek... nu nog uitvinden hoe ik kan concateren (als ik zowiezo het id goed begrijp)...

If it's just us, it seems like an awful waste of space


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
k dan... hiero mn bevinding at the moment.

Wat me verbazingwekkend niet lukt om concat() in een var te proppen. Aan de andere kant lijkt het me niet echt een duur commando. Maar ben al van bijna 10s met de vorige query naar 2s gegaan met deze (op een p133, linux debian unstable)
code:
1
2
3
SELECT * FROM items 
WHERE concat(serial, naam) LIKE '%auto%' 
  AND concat(serial, naam) LIKE '%33%'

If it's just us, it seems like an awful waste of space


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Heb je een index staan op de kolommen waar je op zoekt? Zo niet; voer dan de volgende query uit en tel uit je tijdwinst:
code:
1
ALTER TABLE items ADD INDEX serialnaam (serial, naam)

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 19-06 15:04

HurrI

No fear... I is here

Topicstarter
Op woensdag 03 april 2002 00:13 schreef bigtree het volgende:
Heb je een index staan op de kolommen waar je op zoekt? Zo niet; voer dan de volgende query uit en tel uit je tijdwinst:
code:
1
ALTER TABLE items ADD INDEX serialnaam (serial, naam)
Ik had inmiddels de nut van index al ontdekt jah. Maar thx voor de tip.

If it's just us, it seems like an awful waste of space


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Was deze versnelling voldoende voor je of moet het nu nog sneller? Graag gedaan trouwens :)
Pagina: 1