Probleem met query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • tom_swinkels
  • Registratie: Februari 2010
  • Laatst online: 09-12-2024
Dag beste PHPers,

Ik ben op het moment bezig met een ruilwaarde systeem voor de wel bekende community "habbohotel". De bedoeling is dat mijn script ook ruilwaardes gaat op halen van andere fansites (Ruilwaarde.nl, Habbopagina.nl), deze waardes worden opgeslagen in mijn database table "ruilwaarde_value" dit werkt allemaal prima.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 
-- Tabel structuur voor tabel `ruilwaarde_value`
-- 

CREATE TABLE `ruilwaarde_value` (
  `value_id` int(11) NOT NULL auto_increment,
  `furni_id` int(11) NOT NULL default '0',
  `furni_name` varchar(255) NOT NULL,
  `value_hc` varchar(11) NOT NULL,
  `value_credit` varchar(11) NOT NULL,
  `value_position` enum('1','2','3') NOT NULL default '2' COMMENT '1=Up, 2=Equal, 3=Down',
  `value_site` enum('1','hp','rw') NOT NULL,
  PRIMARY KEY  (`value_id`),
  FULLTEXT KEY `furni_name` (`furni_name`)
) ENGINE=MyISAM AUTO_INCREMENT=4087 DEFAULT CHARSET=utf8 AUTO_INCREMENT=4087 ;


De meubels worden aan de hand van de opgegeven category geladen uit de database table "ruilwaarde_furni". Vervolgens word er gekeken of de "furni_name" uit de table "ruilwaarde_furni" overeen komt met een "furni_name" uit de table "ruilwaarde_value", dit gebeurt nu dus nog met de mysql function LIKE %meubelname%.

code:
1
2
3
4
5
6
7
8
9
10
11
12
-- 
-- Tabel structuur voor tabel `ruilwaarde_furni`
-- 

CREATE TABLE `ruilwaarde_furni` (
  `furni_id` int(11) NOT NULL auto_increment,
  `category_id` int(11) NOT NULL,
  `furni_name` varchar(255) NOT NULL,
  `furni_img` varchar(255) NOT NULL,
  `furni_state` enum('1','2') NOT NULL default '2' COMMENT '1=Off, 2=On',
  PRIMARY KEY  (`furni_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1345 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1345 ;


Het probleem is nu alleen dat ruilwaarde.nl en habbopagina.nl niet allemaal de zelfde meubel namen hebben. Bijvoorbeeld "hc bank" en "hc-bank" wanneer ik nu dus met LIKE %hcbank% zal op vragen zal ik niet het resultaat "hc-bank" krijgen.

Dit probleem heb ik al proberen op te lossen op de volgende manier:
code:
1
"SELECT `furni_name`,`value_position`,`value_hc`,`value_credit` FROM `ruilwaarde_value` WHERE `value_site` = 'rw' AND `furni_id` = '" . $meubelAssoc['furni_id'] . "' OR MATCH (furni_name) AGAINST ('+" . str_replace(" ", " +", $meubelAssoc['furni_name']) . "' IN BOOLEAN MODE)";


Alleen krijg je dus ook dingen die niet kloppen bijvoorbeeld "blaue zeeduif" ook "witte zeeduif" als resultaat te zien.

Iemand enig ideé over hoe ik dit wel kan oplossen?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Consistente naamgeving afdwingen of eenduidige ID's afspreken...of inderdaad false positives voor lief nemen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • tom_swinkels
  • Registratie: Februari 2010
  • Laatst online: 09-12-2024
NMe schreef op dinsdag 24 mei 2011 @ 11:25:
Consistente naamgeving afdwingen of eenduidige ID's afspreken...of inderdaad false positives voor lief nemen.
Met ID's is eigenlijk geen optie. Aangezien er 1000de meubels in de database zijn en ze dan een voor een koppelen lijkt me niet leuk? De koppel mogelijkheid met ID's zit er wel al in voor de meubels die ik handmatig kan doen als ze dus helemaal de zelfde naam hebben.

Misschien kan ik dit systeem gebruiken om nu alle ID's te koppelen met LIKE % % en de meubels die dan niet kloppen handmatig het goede "furni_id" gaan geven?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bijvoorbeeld.

Overigens is LIKE geen functie maar een operator en kun je die beter vermijden als je juist precieze strings wil matchen omdat het een trage bedoening is. ;)

Overigens geeft MATCH een score terug die je óók kan selecteren. Je kan natuurlijk zelf die score selecteren en dan alleen resultaten met een bepaalde minimale score in je resultset opnemen met een simpele WHERE. ;)

[ Voor 40% gewijzigd door NMe op 24-05-2011 12:44 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je kan ook een eigen soort escape toepassen op de namen, strip alle spaces en streepjes weg en sla die naam erbij op. Probeer eerst daar een hit op te vinden (sneller) en als je dan niks vind probeer je het met LIKE danwel MATCH.

Acties:
  • 0 Henk 'm!

  • tom_swinkels
  • Registratie: Februari 2010
  • Laatst online: 09-12-2024
Cartman! schreef op dinsdag 24 mei 2011 @ 13:07:
Je kan ook een eigen soort escape toepassen op de namen, strip alle spaces en streepjes weg en sla die naam erbij op. Probeer eerst daar een hit op te vinden (sneller) en als je dan niks vind probeer je het met LIKE danwel MATCH.
Als ik alles zonder spaties en streepjes ga opslaan kan ik bij het weergeven toch nooit weer spaties terug toveren?

Ik heb het hier even met de leraar op school over gehad hij zei kijk eens naar de mysql functie "SOUNDS LIKE"? Iemand hier enige ervaring met deze function?

Verder gaf hij ook advies om eens te kijken of mysql een stip function heeft en zo een strip uit te voeren op de colum die je wilt vergelijken en vervolgens een stip op de data die je wilt zoeken. Zo dat er van alle 2 de kanten word gezocht en verleken zonder spaties etc.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
tom_swinkels schreef op dinsdag 24 mei 2011 @ 13:52:
[...]


Als ik alles zonder spaties en streepjes ga opslaan kan ik bij het weergeven toch nooit weer spaties terug toveren?
Daar richt je dan een apart veld voor in slimmerik ;)

code:
1
2
3
4
id   name          fixedname
1    table foo     tablefoo
2    table-foo     tablefoo
3    table!-foo!~  tablefoo
tom_swinkels schreef op dinsdag 24 mei 2011 @ 13:52:
Ik heb het hier even met de leraar op school over gehad hij zei kijk eens naar de mysql functie "SOUNDS LIKE"? Iemand hier enige ervaring met deze function?
Sounds like :? Nee, geen ervaring mee. Wel SOUNDEX
edit:
Ah; SOUNDS LIKE is een "alias" van SOUNDEX :D :X

[ Voor 30% gewijzigd door RobIII op 24-05-2011 14:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

tom_swinkels schreef op dinsdag 24 mei 2011 @ 13:52:
[...]

Als ik alles zonder spaties en streepjes ga opslaan kan ik bij het weergeven toch nooit weer spaties terug toveren?
Wie heeft gezegd dat je ze niet allebei kan opslaan in aparte velden?
Ik heb het hier even met de leraar op school over gehad hij zei kijk eens naar de mysql functie "SOUNDS LIKE"? Iemand hier enige ervaring met deze function?
SOUNDS LIKE is een operator, geen functie. De functie die deze operator makkelijker beschikbaar maakt heet SOUNDEX. Dergelijke functies zijn heel leuk maar vreten ook behoorlijk wat resources en ik zou er ver van weg blijven als je ze niet nodig hebt. (Sorry, ik verwarde soundex met levenshtein.) Sowieso zou je precies hetzelfde probleem hebben als met fulltext zoals je nu hebt.
Verder gaf hij ook advies om eens te kijken of mysql een stip function heeft en zo een strip uit te voeren op de colum die je wilt vergelijken en vervolgens een stip op de data die je wilt zoeken. Zo dat er van alle 2 de kanten word gezocht en verleken zonder spaties etc.
Dat is precies wat Cartman! zegt alleen wil hij dat daarbij ook nog eens redundant opslaan.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NMe schreef op dinsdag 24 mei 2011 @ 14:03:

Dat is precies wat Cartman! zegt alleen wil hij dat daarbij ook nog eens redundant opslaan.
Je kunt ook de SOUNDEX al redundant opslaan ;) Scheelt weer :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 24 mei 2011 @ 14:07:
[...]

Je kunt ook de SOUNDEX al redundant opslaan ;) Scheelt weer :P
True. :P Maar dat kan weer niet als je SOUNDS LIKE wil gebruiken, wel met SOUNDEX(). Deze twee betekenen hetzelfde:
MySQL:
1
2
3
veld1 SOUNDS LIKE veld2

SOUNDEX(veld1) = SOUNDEX(veld2)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NMe schreef op dinsdag 24 mei 2011 @ 14:12:
Maar dat kan weer niet als je SOUNDS LIKE wil gebruiken, wel met SOUNDEX(). Deze twee betekenen hetzelfde:
Huh?
SQL:
1
2
3
4
5
insert into sometable (foo, bar, redundant_soundslike_veld) values (x, y, soundex(y))

--In de zoekquery:
Select ...
Where redundant_soundslike_veld SOUNDS LIKE myparameter

Niet dan?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • tom_swinkels
  • Registratie: Februari 2010
  • Laatst online: 09-12-2024
NMe schreef op dinsdag 24 mei 2011 @ 14:12:
[...]

True. :P Maar dat kan weer niet als je SOUNDS LIKE wil gebruiken, wel met SOUNDEX(). Deze twee betekenen hetzelfde:
MySQL:
1
2
3
veld1 SOUNDS LIKE veld2

SOUNDEX(veld1) = SOUNDEX(veld2)
Maar zoals jullie zei levert dit het zelfde resultaat als "fulltext"? Dan is dit dus niet de oplossing. Ik zit zelf ook nog te denken om een cronjob in te stellen die de furni_id gewoon in gaat vullen en dat ik bij het ophalen wat de gebruikers dus zien alleen maar naar de ID's hoef te kijken? Of is het net zo makkelijk en net zo snel om naar de redundant naam te kijken?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 24 mei 2011 @ 14:14:
[...]

Huh?
SQL:
1
2
3
4
5
insert into sometable (foo, bar, redundant_soundslike_veld) values (x, y, soundex(y))

--In de zoekquery:
Select ...
Where redundant_soundslike_veld SOUNDS LIKE myparameter

Niet dan?
Nee, want dan doe je onder water dit:
MySQL:
1
WHERE SOUNDEX(SOUNDEX(waarde)) = SOUNDEX(myparameter)

Geen idee of de soundex van een soundex hetzelfde teruggeeft; als dat zo is dan werkt het vast wel. :Y)
tom_swinkels schreef op dinsdag 24 mei 2011 @ 14:16:
[...]

Maar zoals jullie zei levert dit het zelfde resultaat als "fulltext"?
Niet helemaal, ik verwarde soundex met levenshtein en dat is hier niet zo van toepassing. Je zou inderdaad soundex kunnen gebruiken.

[ Voor 22% gewijzigd door NMe op 24-05-2011 14:18 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NMe schreef op dinsdag 24 mei 2011 @ 14:17:
[...]

Nee, want dan doe je onder water dit:
Ah; duh 8)7 Ofcourse.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • tom_swinkels
  • Registratie: Februari 2010
  • Laatst online: 09-12-2024
Ik zal eens gaan kijken hoe ver ik met deze function ga komen, alvast bedankt!

code:
1
select * from ruilwaarde_value where soundex(furni_name) = soundex('Camp Rock TV')

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je maar goed in je achterhoofd de "limitaties" van Soundex houdt.
SQL:
1
select soundex('bird'), soundex('bord'), soundex('bard'), soundex('brt'), soundex('brrrt')

'B630', 'B630', 'B630', 'B630', 'B630'

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 23:32
RobIII schreef op dinsdag 24 mei 2011 @ 14:44:
Als je maar goed in je achterhoofd de "limitaties" van Soundex houdt.
SQL:
1
select soundex('bird'), soundex('bord'), soundex('bard'), soundex('brt'), soundex('brrrt')

'B630', 'B630', 'B630', 'B630', 'B630'
En beseft dat dit een Engelse Soundex variant is.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
creator1988 schreef op dinsdag 24 mei 2011 @ 15:28:
[...]


En beseft dat dit een Engelse Soundex variant is.
Ook nog inderdaad, maar een Nederlandse zou vergelijkbare "issues" hebben ;)
Overigens; ik weet niet hoe 't bij MySQL geregeld is maar voor MSSQL kun je volgens mij een taalspecifieke soundex afdwingen door dat ergens op DB-niveau in te stellen. Ik weet alleen zo snel niet meer waar/hoe :P
Of ben ik nou in de war met FT word breakers... ik weet 't effe niet meer :P

Overigens2: Een soundex zou altijd een 4 karakters tellende "hash" moeten opleveren (letter-cijfer-cijfer-cijfer); althans: dat is het "originele" algoritme. MySQL maakt daar (bij mij althans) vrolijk een veel langere string van wanneer nodig
SQL:
1
select soundex('hottentottententententoonstelling')

H35353535353523452

SQL Server geeft netjes:
H353


En nou zit ik hiermee in m'n kop :D :P

[ Voor 76% gewijzigd door RobIII op 24-05-2011 16:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • tom_swinkels
  • Registratie: Februari 2010
  • Laatst online: 09-12-2024
Dag allen deze function lijkt het goed te doen! Alleen heb ik nu een probleem met de data die in de database verwerkt word waar door hij niet goed werk.

Aloë Vera! // Aloë Vera! :: Deze komen namelijk niet overeen officiaal zou deze in de database opgeslagen moeten zijn als (Aloë Vera!) helaas heeft hij dit niet gedaan.

Ik dacht dat je de speciale karakters op de volgende manier om moest zetten naar HTML tekens? Of licht het aan de mysql_real_escape_string?

code:
1
`furni_name` = '" . mysql_real_escape_string(htmlspecialchars($aapje['naam'], ENT_QUOTES)) . "'


EDIT:

Probleem gevonden de furni_name word namelijk al gevonden als "Röntgenscherm" en dan gooit hij er nog een keer htmlspecialchars oven en dan krijg ik dus "Aloë Vera!" is dit ook op te lossen?

[ Voor 15% gewijzigd door tom_swinkels op 24-05-2011 20:01 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Daar zijn echt absurd veel topics over. Escapen doe je voor een bepaalde context. Zo gebruik je bijvoorbeeld mysql_real_escape_string() als je een string echt :+ voor mysql wilt escapen. En html zooi gebruik je dan als je met, jawel, html bezig gaat. Die functies hebben op dit punt niets te zoeken.

{signature}

Pagina: 1