Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL/MySQL] Gebruikers Zoeken (CONCAT)

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

  • xTmPizzaMan
  • Registratie: Maart 2003
  • Laatst online: 06-11 11:43
Ok jongens probleem opgelost code werkt wel... Het is weer typisch een vorm van 2 uur naar je scherm staren en het typfoutje wat je hebt gemaakt niet meer zien! Ik had de voor en achternaam in de verkeerde volgorde geplaatst..... Ik geef de correcte sql query zodat anderen er misschien van kunnen leren!! Groeten.
code:
1
2
3
4
5
6
7
select contact_id,contact_first_name,contact_last_name from contacts 
where 
contact_first_name LIKE '%admin p%' 
OR contact_last_name LIKE '%admin p%' 
OR LCASE(CONCAT(contact_first_name,' ',contact_last_name)) like LCASE('%admin p%') 
OR LCASE(CONCAT(contact_last_name,' ',contact_first_name)) like LCASE('%admin p%') 
order by contact_first_name



Hallo,

Ik heb het volgende probleem. Ik moet gebruikers zoeken in mijn tabel en ze terug geven. Je kan gebruikers zoeken op voornaam, achternaam en voor en achternaam. Ik heb één textveld waar je de zoekquery in moet vullen. Dus een gebruiker hierin alleen de voornaam, alleen de achternaam, voor en achternaam, achternaam en voornaam opgeven. Ik heb de volgende tabel met contactgegevens van verschillende gebruikers.
code:
1
2
3
4
5
6
7
8
id      contact_first_name  contact_last_name
1   Admin                        Person
2   test                            Gebruiker
3       Manager                 M
4   Worker                       W
5   AA                        AA
6   Admin                       test
7   Test                          Person

nu heb ik een query:
code:
1
2
3
4
select contact_id,contact_first_name,contact_last_name
from contacts 
where contact_first_name LIKE '%a%' 
OR contact_last_name LIKE '%a%'

Deze query geeft alle results terug waar in de voornaam of achternaam een a in zit. Dit is correct.

Nu wil ik de query uitbreiden. Nu wil de gebruiker de "Admin Person" zoeken. Als ik de bovenstaande query uit voer heb ik een probleem dat wanneer hij de "Admin P" heeft getypt geen results meer op leverd. Dit klopt ook want de query zal geen waarde terug geven. Nu weet ik dat je met CONCAT strings kan mergen in een sql query.
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT CONCAT( contact_first_name, ' ', contact_last_name ) AS Users FROM `contacts` 

laat de volgende tabel zien.

contact_id  Users
1   Admin Person
2   test Gebruiker
3   Manager M
4   Worker W
5   AA AA
6   Admin test
7   Test Person

nu wil ik de volgende sql query uitvoeren.
code:
1
2
3
select c.contact_id,c.contact_first_name,c.contact_last_name
from contacts as c
where LCASE(CONCAT(c.contact_last_name,' ',c.contact_first_name)) like LCASE('%admin%')

Bovenstaande code laat contact_id 1 en 6 zien. (Correct)
code:
1
2
3
select c.contact_id,c.contact_first_name,c.contact_last_name
from contacts as c
where LCASE(CONCAT(c.contact_last_name,' ',c.contact_first_name)) like LCASE('%admin p%')

Maar als ik "Admin P" typ geeft hij geen waardes meer terug. (Dit is mijn probleem)
Ik wil ook maken dat de gebruiker op "Person A" kan zoeken.

Hoe maak ik een query waarin sql ook kan zoeken op voor en achternaam die in één string zitten?
Ik heb nu 4 uur lopen zoeken en ik schakel maar even een hulplijntje in. Als er vragen of onduidelijkheden zijn graag posten.

Alvast bedankt voor de hulp.

Oh edit: ik draai Apache2 met MySQL 5.0.45, PHP5.

Groeten,

Antek

[ Voor 12% gewijzigd door xTmPizzaMan op 31-10-2007 11:45 ]

No sig!


Verwijderd

Ik weet niet onder welke database engine je tabellen draaien, maar als dat MyISAM is raad ik je aan om full text te gaan zoeken. Sowieso denk ik dat zoeken op deze manier erg traag kan worden. Dit omdat MySQL namelijk de functie (CONCAT, LCASE, etc) eerst over al je records heen haalt en dan pas gaat vergelijken.

edit:

Ik realiseer me nu dat dit misschien een klein beetje een (doel)loze reactie was van me. Wellicht bied full-text zoeken gedeeltelijk de oplossing omdat het in boolean mode ook wildcars ondersteund. Overigens snap ik niet dat MySQL niets vind met "Admin P", tweede is wel logisch dat hij het niet vind omdat hij strings vergelijkt eigenlijk en niet zoekt.

[ Voor 37% gewijzigd door Verwijderd op 31-10-2007 11:52 ]


  • xTmPizzaMan
  • Registratie: Maart 2003
  • Laatst online: 06-11 11:43
Dank je wel voor de tip. Ik gebruik ook een MyISAM engien. Ik heb de fields full text gemaakt. Via de query ALTER TABLE contacts ADD FULLTEXT(contact_first_name, contact_last_name); Ik doe een search via
code:
1
2
3
4
5
6
7
8
9
10
SELECT contact_id, contact_first_name, contact_last_name
FROM contacts
WHERE MATCH (
contact_first_name, contact_last_name
)
AGAINST (
'*admin person*'
IN BOOLEAN
MODE
)

dit geeft mij 3 statements results terug
Het probleem is hoe meer ik typ hoe meer resultaten ik terug krijg. Dit is niet de bedoeling. Het is de bedoeling om een autofill script te maken waarin je in een veld de naam typt en hij keuzes kan terug geven. Ik kan LCASE bij mijn vorige query wel weg halen. Dat zou wel wat delay vertragen. Ik verwacht niet dat er meer dan 1500 contacten opgeslagen worden. De query kan na verwachting maximaal 3x per seconde uit worden gevoerd. Dus ik vraag me af of het wel degelijk zin heeft om Full-text te zoeken. Ik ga nog even zeker onderzoeken wat full-text voor mij kan doen! Bedankt!

Nog even een verklaring waarom hij niets vind op de 2e query...
CONCAT(c.contact_last_name,' ',c.contact_first_name)) geeft de resultaten als Achternaam, voornaam. In mijn zoekquery is de voornaam admin achternaam p.
Dus hij geeft Person Admin terug.

No sig!


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
xTmPizzaMan schreef op woensdag 31 oktober 2007 @ 13:51:
Nog even een verklaring waarom hij niets vind op de 2e query...
CONCAT(c.contact_last_name,' ',c.contact_first_name)) geeft de resultaten als Achternaam, voornaam. In mijn zoekquery is de voornaam admin achternaam p.
Dus hij geeft Person Admin terug.
Debug tip, 1e actie bij twijfel: Doe gewoon 'SELECT [Hippe functie hier] FROM TableName' en bekijk de output van de functie. :)

{signature}


Verwijderd

xTmPizzaMan schreef op woensdag 31 oktober 2007 @ 13:51:
Dank je wel voor de tip. Ik gebruik ook een MyISAM engien. Ik heb de fields full text gemaakt. Via de query ALTER TABLE contacts ADD FULLTEXT(contact_first_name, contact_last_name); Ik doe een search via
code:
1
2
3
4
5
6
7
8
9
10
SELECT contact_id, contact_first_name, contact_last_name
FROM contacts
WHERE MATCH (
contact_first_name, contact_last_name
)
AGAINST (
'*admin person*'
IN BOOLEAN
MODE
)

dit geeft mij 3 statements results terug
Het probleem is hoe meer ik typ hoe meer resultaten ik terug krijg. Dit is niet de bedoeling. Het is de bedoeling om een autofill script te maken waarin je in een veld de naam typt en hij keuzes kan terug geven. Ik kan LCASE bij mijn vorige query wel weg halen. Dat zou wel wat delay vertragen. Ik verwacht niet dat er meer dan 1500 contacten opgeslagen worden. De query kan na verwachting maximaal 3x per seconde uit worden gevoerd. Dus ik vraag me af of het wel degelijk zin heeft om Full-text te zoeken. Ik ga nog even zeker onderzoeken wat full-text voor mij kan doen! Bedankt!

Nog even een verklaring waarom hij niets vind op de 2e query...
CONCAT(c.contact_last_name,' ',c.contact_first_name)) geeft de resultaten als Achternaam, voornaam. In mijn zoekquery is de voornaam admin achternaam p.
Dus hij geeft Person Admin terug.
Inderdaad voor auto aanvullen is Full-Text searching niet de beste oplossing. Deze techniek kijkt namelijk of zoekwoorden voorkomen in een volledig tekst geindexeerde index.

Owja nog een tip: :P

Doe niet LCASE over je phrase en je velden. Dit kost heel veel tijd (heb ik al eerder gezegd) een goede oplossing is een collatie pakken die niet hoofd letter gevoelig is. Bijvoorbeeld latin1_swedish_ci (de "ci" staat voor case insensitive :+ ) Volgens deze collatie is ""KeEs" hetzelfde als "kEeS".

Succes!

  • xTmPizzaMan
  • Registratie: Maart 2003
  • Laatst online: 06-11 11:43
Hey bedankt jullie twee! Altijd handig wat extra tips over SQL. Zo LCASE is er uit gesloopt en ik heb de character set (coallitie) ook aangepast. Het scriptje draait nu als een treintje. :) Ik wist niet dat SQL al deze handige functies bood. Voor een search engien is Full-Text echt handig. Ik neem hem mee voor mijn volgende projecten.

No sig!

Pagina: 1