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

sql query die twee strings uit twee kolommen samenplakt

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste tweakers,
voor de inlogpagina van mij site stuitte ik op het volgende probleem:
De gebruikers, dus de mensen die kunnen inloggen, zitten in een mysql db opgeslagen, volgens het schoolvoorbeeld, dwz 'user_id', 'voornaam', 'achternaam', 'wachtwoord'.
Nu, op de inlogpagina kan de gebruiker zijn naam beginnen typen in de inputbox, en via een ajax, en bijhorende callback functie (jquery, .keyup(), allemaal vrij simpel) verschijnen alle namen uit de database die deze letters (ik geloof dat dit substring noemt) hebben in de naam. Een klein voorbeeld indien het voorafgaande onduidelijk is: als je in de inputbox 'ma' intypt, verschijnt in een dropdown onderaan de inputbox
'maarten '
'thomas '
en nog zo'n door mij impulsief neergepende namen ;)

Dit allemaal lukt perfect, als ik werk met slechts één gebruikersnaam; ik zou echter willen dat je kan zoeken in de voornaam én achternaam in een keer. Je zou dus de 'voornaam', en 'achternaam', uit de mysql db aan elkaar kunnen plakken, en dan kijken of de door de gebruiker ingetypte string voorkomt in deze samengestelde string. Dit zou dus lukken met een aardige brok PHP, maar ik vermoed echter dat er een oplossing is met één enkele SQL-query, waarbij in de query dus gezocht wordt of
SQL:
1
SELECT * FROM users WHERE $string REGEXP 'voornaam'+'achternaam'

Hopelijk is dit niet allemaal te ingewikkeld, en weet iemand welke SQL query ik hiervoor moet gebruiken.
Alvast bedankt :)

  • M0nkeymen
  • Registratie: Maart 2009
  • Laatst online: 23-11 12:03

M0nkeymen

Monkeystyle!

zoiets?
SQL:
1
SELECT [Firstname] + [Lastname] as samenvoeging FROM [dbo].[tblUsers]


waar Firstname en Lastname kolommen zijn in de tabel tblUsers.

Mare de aan elkaar plakken lijkt me niet zo'n goed idee

[ Voor 51% gewijzigd door M0nkeymen op 04-04-2013 22:04 ]

psn: M0nkeymen81 | Inglourious Guardians


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Je kunt met een OR ook gewoon in beide kolommen kijken. :)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • M0nkeymen
  • Registratie: Maart 2009
  • Laatst online: 23-11 12:03

M0nkeymen

Monkeystyle!

Ow wacht, ik begreep hem verkeerd denk ik, dit lijkt beter te werken :)

SQL:
1
SELECT * FROM [dbo].[tblUsers] Where [Firstname] LIKE '%' + $string + '%' or [Lastname] LIKE '%' + $string + '%'


Like = bevat, en de Procentjes staan voor alles wat voor en na de string komt.

[ Voor 16% gewijzigd door M0nkeymen op 04-04-2013 22:13 ]

psn: M0nkeymen81 | Inglourious Guardians


  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

M0nkeymen schreef op donderdag 04 april 2013 @ 22:12:
...
Like = bevat, en de Procentjes staan voor alles wat voor en na de string komt.
zoiets maar meer "lijkt op", niet verwarren met contains (=bevat)
http://forums.asp.net/t/1639440.aspx

Iperf


  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 30-10 12:53

Douweegbertje

Wat kinderachtig.. godverdomme

M0nkeymen voegt volgens mij mssql en javascript erdoor heen.

code:
1
SELECT * FROM users WHERE voornaam LIKE '%piet%' OR  achtername LIKE  '%piet%'


Je gebruikt de 'LIKE' als volgt:

%naam% 'naam' komt ERGENS voor.
%naam alles wat met 'naam' eindigt
naam% alles wat met 'naam' begint


Uiteindelijk is dit één van de slechtste manieren, omdat je op deze manier heel de database om zeep helpt. Je blijft uiteraard querys uitvoeren.

De andere manier (afhankelijk hoeveel data je ophaalt) is om gewoon 1 query te doen waarin je alles ophaalt. Vervolgens verwerk je dit en gebruik je de array gewoon om alles uit te halen.

Als je dit voorbeeld bekijkt (wat imo ook de beste autocompleet is): http://jqueryui.com/autocomplete/
Zie je dat je de data op verschillende manieren kan aanroepen.
Je kunt dus ook even je array loopen en het werken als

"waarde1",
"waarde2",
etc
RobIII schreef op donderdag 04 april 2013 @ 22:37:
Ben ik de enige die zich afvraagt wat dit op een login pagina doet :?
Ik las al "schoolvoorbeeld" dus ik negeerde het al :+

[ Voor 11% gewijzigd door Douweegbertje op 04-04-2013 22:39 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ben ik de enige die zich afvraagt wat dit op een login pagina doet :?

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


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Waarom zou je dit willen op de inlogpagina? Binnen een inloggedeelte kan ik er wel toepassingen voor verzinnen, maar op de inlogpagina moet iemand imho niet met 26 pogingen alle echte gebruikersnamen te weten komen.

Als de gebruikers het teveel tikwerk vinden dan bieden eigenlijk alle browsers hier wel onthoud-dingetjes voor en anders geef je maar kortere usernames / userids uit.

@RobIII : niet echt, alleen tik ik langzamer ;)

  • GoVegan
  • Registratie: Juni 2002
  • Laatst online: 18-11 13:28
RobIII schreef op donderdag 04 april 2013 @ 22:37:
Ben ik de enige die zich afvraagt wat dit op een login pagina doet :?
het is wel beetje makkelijk username gokken zo.

Verwijderd

Topicstarter
RobIII schreef op donderdag 04 april 2013 @ 22:37:
Ben ik de enige die zich afvraagt wat dit op een login pagina doet :?
op een normale site waar gebruikers zich kunnen registreren ben ik het volledig met je eens, maar hier maak ik iets voor een groep waarvan alle leden elkaar kennen :)

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 30-10 12:53

Douweegbertje

Wat kinderachtig.. godverdomme

Verwijderd schreef op donderdag 04 april 2013 @ 22:44:
[...]


op een normale site waar gebruikers zich kunnen registreren ben ik het volledig met je eens, maar hier maak ik iets voor een groep waarvan alle leden elkaar kennen :)
Dat is een vrij aparte (in feite domme, maar je snapt wat ik bedoel?) redenatie aangezien je site publiekelijk is. Het is niet zo dat niemand anders er kan komen of iets dergelijks. :+

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op donderdag 04 april 2013 @ 22:44:
[...]


op een normale site waar gebruikers zich kunnen registreren ben ik het volledig met je eens, maar hier maak ik iets voor een groep waarvan alle leden elkaar kennen :)
Maar de inlogpagina zal toch waarschijnlijk openbaar zijn, dus iedereen ter wereld kan alle namen achterhalen.

Zoals ik al zei, achter een inlog kan ik wel iets zien in het idee, maar voordat iemand ingelogd is moet je imho dit soort gegevens niet tonen.

Nog even daargelaten dat je gratis en voor niets al de helft van de username-wachtwoord combo weggeeft geef je waarschijnlijk juist bij een vriendensite ook al belangrijke info weg over het wachtwoord. Ik ga niet bij een vriendensite een wachtwoord met dezelfde sterkte als bij een belangrijke site invullen, enkel mijn achternaam oid zal dan al snel volstaan (want die weten de meeste mensen al niet, behalve als je die gratis en voor niets weggeeft bij het inloggen :) )

Verwijderd

Topicstarter
Misschien wel waar. Anyway, ik zal deze functie ook moeten gebruiken bij berichtensysteem etc
Gomez12 schreef op donderdag 04 april 2013 @ 22:50:
[...]

Maar de inlogpagina zal toch waarschijnlijk openbaar zijn, dus iedereen ter wereld kan alle namen achterhalen.

Zoals ik al zei, achter een inlog kan ik wel iets zien in het idee, maar voordat iemand ingelogd is moet je imho dit soort gegevens niet tonen.

Nog even daargelaten dat je gratis en voor niets al de helft van de username-wachtwoord combo weggeeft geef je waarschijnlijk juist bij een vriendensite ook al belangrijke info weg over het wachtwoord. Ik ga niet bij een vriendensite een wachtwoord met dezelfde sterkte als bij een belangrijke site invullen, enkel mijn achternaam oid zal dan al snel volstaan (want die weten de meeste mensen al niet, behalve als je die gratis en voor niets weggeeft bij het inloggen :) )

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je originele vraag zou trouwens zo kunnen:
SQL:
1
2
3
4
5
-- In MySQL:
SELECT * FROM users WHERE CONCAT(voornaam, achternaam) LIKE '%ma%'

-- In databases die wel SQL-conforme concat hebben:
SELECT * FROM users WHERE voornaam || achternaam LIKE '%ma%'


Maar dat zijn extreem inefficiente queries. Wellicht als het snel moet zijn, zou ik de in-fix check weglaten en het domweg zo doen (mits je indexen op zowel voornaam als achternaam hebt):
SQL:
1
2
3
4
5
6
7
-- In recente MySQL's, waarbij indexen gecombineerd kunnen worden:
SELECT * FROM users WHERE voornaam LIKE 'ma%' OR achternaam LIKE 'ma%'

-- in oudere mysql's waar dat nog niet kon:
SELECT * FROM users WHERE voornaam LIKE 'ma%'
UNION
SELECT * FROM users WHERE achternaam LIKE 'ma%'


Maar zoals de rest al zegt... je wil normaliter geen auto-aanvulling van gebruikersnamen in een loginsysteem. Tenzij je systeem zodanig afgeschermt is en je je gebruikers zodanig goed kent dat je het voordeel van gebruiksvriendelijkheid vindt opwegen tegen het nadeel van een prachtige manier aanbieden voor hackers om alle gebruikersnamen te kunnen ophalen.

Let er trouwens ook op dat de combinatie van voor- en achternaam niet uniek is in Nederland. Je kan ze dus sowieso niet als inlognaam hanteren ;)

[ Voor 8% gewijzigd door ACM op 05-04-2013 08:06 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ACM schreef op vrijdag 05 april 2013 @ 08:03:
Let er trouwens ook op dat de combinatie van voor- en achternaam niet uniek is in Nederland. Je kan ze dus sowieso niet als inlognaam hanteren ;)
Precies; maar gegeven:
Verwijderd schreef op donderdag 04 april 2013 @ 22:44:
maar hier maak ik iets voor een groep waarvan alle leden elkaar kennen :)
ga ik er van uit dat 't hooguit een honderdtal records bevat. En dan kom je dus ook wel weg met de queries zoals jij die voorstelt (en dat zou ik dan ook gewoon lekker doen). Wat niet wegneemt dat je in de basis al rot bent dan en helemaal geen autocomplete wil op een loginpagina. Maar zolang je absoluut zeker weet dat je niet verder gaat groeien dan, zeg, je eigen familie, lekker boeie. Als je maar verdomd goed in je achterhoofd houdt dat je dit in eender welk ander project niet nog eens hoeft te flikken en dat je zo'n beetje alle best practices met voeten treedt :P

[ Voor 9% gewijzigd door RobIII op 05-04-2013 10:06 ]

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


  • TallManNL
  • Registratie: Oktober 2005
  • Laatst online: 23-11 09:30
RobIII schreef op donderdag 04 april 2013 @ 22:37:
Ben ik de enige die zich afvraagt wat dit op een login pagina doet :?
Was daar ook al over aan het twijfelen.

Nog gekker is wel de optie om namen te tonen die niet eens beginnen met de ingetypte letters. Niemand begint toch halverwege zijn naam te typen om daarna nog het begin ervoor te schrijven?

geheelonthouder met geheugenverlies

Pagina: 1