Toon posts:

[MYSQL] Where IN LIST oid

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik heb deze tabel:

tabel-naam: x
----------------
id (int 11) | users (varchar 255)
-----------------------------------
1 | ruud,piet,sjaak,hendrik
2 | piet,sjaak
3 | ruud
4 | sjaak,hendrik,ruud


Nu wil ik een query maken die kijkt of de naam 'ruud' in de kolom 'users' staat.

Ik wist dat er een query was die dit kon iets like:

SELECT * FROM x WHERE ruud IS IN LIST users

of iets dergelijks..

Iemand enig idee?? Ik zoek me al een uur een ongeluk.. word er gek van .. :)
expr IN (value,...)
Returns 1 if expr is any of the values in the IN list, else returns 0. If all values are constants, they are evaluated according to the type of expr and sorted. The search for the item then is done using a binary search. This means IN is very quick if the IN value list consists entirely of constants. If expr is a case-sensitive string expression, the string comparison is performed in case-sensitive fashion.

mysql> SELECT 2 IN (0,3,5,'wefwf');
-> 0
mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');
-> 1

The number of values in the IN list is only limited by the max_allowed_packet value. To comply with the SQL standard, from MySQL 4.1 on IN returns NULL not only if the expression on the left hand side is NULL, but also if no match is found in the list and one of the expressions in the list is NULL. From MySQL 4.1 on, IN() syntax also is used to write certain types of subqueries. See section 14.1.8.3 Subqueries with ANY, IN, and SOME.
(dit las ik op mysql.com maar hoe verwerk ik dit nu tot wat ik wil?)

Heb al gezocht enz enz.. niemand schijnt het te weten...

  • Noel
  • Registratie: September 2001
  • Laatst online: 21-05 13:38
Nu wil ik een query maken die kijkt of de naam 'ruud' in de kolom 'users' staat.
select * from tblusers where username = 'ruud'

Als het aantal records in het resultaat gelijk is aan 0 komt hij niet voor. Dat kan je opvangen in je php, asp, of ander scriptgedoe.

Redelijk triviaal, als ik begrijp wat je juist bedoelt natuurlijk.. :)

Edit:
ik zie in je tabel user1, user2, user3 staan bij je eerste record. Dat is niet echt netjes qua databasestructuur.

beter zou bvb kunnen zijn:
code:
1
2
3
4
5
6
7
id    |     groepid     |    username
------------------------------------------
1     |    1            |    user1
2     |    1            |    user2
3     |    2            |    user1   
4     |    2            |    user3
etc


Zo blijft de relatie van welke users bij elkaar horen (groepid) bewaard en kan je zoeken naar de usernames met mijn bovenstaande query. Je hebt zeker nog verschillende tabelmogelijkheden voor deze situatie, het hangt er wat van af wat de rest van je gegevens zijn en in hoeverre het uitbreidbaar moet zijn.

[ Voor 61% gewijzigd door Noel op 03-09-2004 19:17 . Reden: aanvulling... ]

Server: Xeon X3430 21TB RAID 5 | Game: 5900X, 6900XT, dual FS2735 | Mobile: Lenovo X1 Carbon, Thinkpad T440s, Moto G7 Plus


Verwijderd

Dan kan je beter een

Select * from users where like 'ruud' gebruiken :P

Verwijderd

Topicstarter
jah ik weet dat relaties beter is .. maar het gaat om een simpel statistiekje en daarvoor wil ik niet me hele datamodel (wat normaal wel met relaties gaat) omgooien... er was toch iets als WHERE 'ruud' IN LIST (users) oid?

  • Fatamorgana
  • Registratie: Augustus 2001
  • Laatst online: 21-07-2025

Fatamorgana

Fietsen is gezond.

Zoiets?

select * from tblusers where username LIKE '%ruud%'

Verwijderd

Topicstarter
hmmm werkt dat ook als ik een lijst heb met


1,2,12,11,13,14,25,35

en daaruit 1 wil selecteren, pakt ie dan alleen de 1e één of pakt ie ook 11 en 13 14


edit:
dat werkt dus niet..

[ Voor 12% gewijzigd door Verwijderd op 03-09-2004 20:01 ]


  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 22-05 23:32
Verwijderd schreef op 03 september 2004 @ 19:59:
hmmm werkt dat ook als ik een lijst heb met

1,2,12,11,13,14,25,35

en daaruit 1 wil selecteren, pakt ie dan alleen de 1e één of pakt ie ook 11 en 13 14


edit:
dat werkt dus niet..
Idd, met een like pakt MySQL die andere ook omdat het allemaal in die ene cell staat. Het is immers 1 grote string.
Het enige wat je nu nog zou kunnen doen is met PHP (of wat je ook gebruikt) die string splitsen op komma's, maar dit is niet zo'n nette oplossing.

Als je het echt goed en snel wilt moet je het advies van -Noel- opvolgen.
Zo zie je maar weer dat ook bij kleine projectjes je je database en code netjes op moet bouwen omdat je anders toch tegen rare problemen aan loopt.

[ Voor 12% gewijzigd door Mac_Cain13 op 03-09-2004 20:57 ]


Verwijderd

Topicstarter
WHERE todo_task_for LIKE '".$user_id.",%' OR todo_task_for LIKE '%,".$user_id.",%' OR todo_task_for LIKE '%,".$user_id."%' OR todo_task_for LIKE '".$user_id."'


Zo heb ik het opgelost met dank aan vincent van yapf.net :) Best logisch in feite :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 03 september 2004 @ 19:59:
hmmm werkt dat ook als ik een lijst heb met


1,2,12,11,13,14,25,35

en daaruit 1 wil selecteren, pakt ie dan alleen de 1e één of pakt ie ook 11 en 13 14


edit:
dat werkt dus niet..
Sorry, maareh... :r

Je hebt een onbekend aantal waarden comma separated in één veld staan. En je weet dat het fout is. Dan snap ik dus niet waarom je niet een relationele database in mekaar klopt. Dat bespaart je al de moeite die je nu probeert te doen. En als je dat niet wil, dan is het heel simpel:
Verander de lijst in dit:

,1,2,12,11,13,14,25,35,

Op die manier staat er voor en achter elk getal een komma, en dan kun je dus een LIKE '%,1,%' doen.

'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.


Verwijderd

Topicstarter
hmm nog beter ja :)
Pagina: 1