Kijken of nummer voorkomt
Ik had een systeem gemaakt, waarmee ik kon kijken of jouw ID voorkwam in een colom van een row, bijvoorbeeld of het ID 1 voorkomt in: 23, 1
Dit werkt. Maar nu zit ik met het probleem:
Als ik kijk of het ID 1 overeen komt met bijvoorbeeld: 21, 55, 3
Dan geeft mijn systeem aan: A, 1 komt erin voor dus laten we melding zien. Maar dit is NIET de bedoeling. Alleen als jouw ID los van andere nummers staat. Mijn code is momenteel dit om het te controleren:
$gelezen is in dit geval 221 en $id is 1
Hoe zou ik dit kunnen oplossen? En alsjeblieft geen comments dat ik een aparte tabel moet maken omdat ik dit makkelijker vind, dus geen comments hierover pls ;-)
Alvast hartstikke bedankt!
Dat blijkt dat je het makkelijker vindt. Dan vind je het vast geen probleem om het zelf op te lossen, toch?
Pas je een vergelijking toe op een string. Je zult getallen moeten vergelijken.
Code (php)
Verder ga je later hard huilen als je je eigen code nog eens terugleest...
Gewijzigd op 21/02/2017 02:07:09 door Frank Nietbelangrijk
En dat het 'makkelijker is', dat is geen argument, want een losse tabel gebruiken is juist nog makkelijker.
Stel.... Je wilt er iemand uithalen die halverwege de lijst staat, hoe ga je dat dan doen?
Normaal is het een DELETE-query, maar nu moet je weer extra regels schrijven.
Gewijzigd op 20/02/2017 23:54:40 door - Ariën -
Toevoeging op 21/02/2017 07:58:57:
En het lag niet aan die code ;S maar aan mijn query, waar ik net achter kwam
Code (php)
1
$sql = $connection->query("SELECT * FROM `paneel_meldingen` WHERE `deelnemers` LIKE '%$id%' AND `gelezen`='0' ORDER BY `id` DESC");
Gewijzigd op 21/02/2017 08:02:25 door - Rob -
Maar toch blijf ik benieuwd waarom je zo omslachtig doet.
ja want als je op 1 zoekt en in de string staat '1111111, 2, 1' dan haalt hem er er terecht uit
als als alle enen ontbreken niet.....
zoek dan op LIKE '% $id,%'
maar helaas werkt dat weer niet als het laatste getal gezocht wordt....
FIND_IN_SET is natuurlijk een optie, maar wat je ook doet, het is langzamer dan gewoon fatsoenlijk normaliseren. Dan hoef je ook geen gekke kunstgrepen in je code uit te halen, maar kun je gewoon nette queries schrijven.
Ivo P op 21/02/2017 19:37:58:
zoek dan op LIKE '% $id,%'
maar helaas werkt dat weer niet als het laatste getal gezocht wordt....
maar helaas werkt dat weer niet als het laatste getal gezocht wordt....
Je vergeet de spatie die vóór $id moet staan. Die is er dan weer niet bij het eerste getal. ;-)
Met een reguliere expressie zou je in MySQL het probleem met de komma aan het eind nog kunnen verhelpen:
REGEXP ' $id(,|$)'
Helaas werkt dit truukje dan weer niet met de spatie ervoor. Met een regex in PHP zou dat dan weer wel kunnen:
/(^|\s)$id(,|$)/
Maar je maakt de spatie dan weer significant. Op zich zou er niets op tegen moeten zijn als er na een komma meteen een getal komt:
/(^|\s|,)$id(,|$)/
maar het is wellicht eenvoudiger om dan op word boundaries te matchen:
/\b$id\b/
En toch ga ook ik voor een tabel. Veel sneller. ;-)
En dan gaan we door naar de vragen
"hoe delete ik id=35 uit de lijst?"
"waarom wordt mijn site zo traag?"
en tenslotte "help, door een regex fout loopt er van alles in de soep en zien gebruikers elkaars berichten"
Fijn, zo zelf het wiel uitvinden en volharden dat een ovalen 6-hoek ook best wel een beetje wil rollen.
Toevoeging op 22/02/2017 10:04:20:
work-around: geen spaties opnemen, en altijd afsluiten met een komma. Ook als er maar 1 waarde in staat en dus ook achter het laatste getal.
En dan gaan we door naar de vragen
"hoe delete ik id=35 uit de lijst?"
"waarom wordt mijn site zo traag?"
en tenslotte "help, door een regex fout loopt er van alles in de soep en zien gebruikers elkaars berichten"
Fijn, zo zelf het wiel uitvinden en volharden dat een ovalen 6-hoek ook best wel een beetje wil rollen.
Dat zeg je nu wel, maar heb je die tests gezien met vierkante wielen op een nogal bijzondere ondergrond?
Klinkt natuurlijk leuk als in "ja het kan werken" maar dan moet je al een erg bijzondere situatie hebben, die hier niet aanwezig is uiteraard.
Gewijzigd op 22/02/2017 10:10:34 door Ben van Velzen
Hmm... volgens mij zit er een regexfout in deze site, want ik zie de laatste berichten dubbel. ;-)
Eigenlijk moeten we dat ondervangen.
dan was het een regex fout.
Service unavailable inderdaad, dus mijn laatste post had even een edit nodig.
LOCATE() om een soort van in_array() functionaliteit na te bootsen.
Wat je doet is het volgende:
- plak een komma voor en achter de needle (de gezochte waarde)
- plak een komma voor en achter de haystack (de komma-gescheiden set waarin je zoekt)
Dit doe je met CONCAT().
Gegeven de set 21,55,3 (let op, géén extra spaties tussen de waarden / na de komma's!), je kunt dan als volgt zoeken op de waarde 3:
12 komt hier niet in voor:
En 55 weer wel:
Afhankelijk van hoe (en hoe vaak) je dit gebruikt is dit mogelijk niet de meest efficiënte oplossing...
Dit alles lijkt mij voortborduren op een slecht ontwerp, maar als je dit echt, ondanks alle waarschuwingen, zo wilt doen zou je iets kunnen doen met Wat je doet is het volgende:
- plak een komma voor en achter de needle (de gezochte waarde)
- plak een komma voor en achter de haystack (de komma-gescheiden set waarin je zoekt)
Dit doe je met CONCAT().
Gegeven de set 21,55,3 (let op, géén extra spaties tussen de waarden / na de komma's!), je kunt dan als volgt zoeken op de waarde 3:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
mysql> SELECT LOCATE(CONCAT(',', '3', ','), CONCAT(',', '21,55,3', ',')) > 0 AS found;
+-------+
| found |
+-------+
| 1 |
+-------+
1 row in set (0.01 sec)
+-------+
| found |
+-------+
| 1 |
+-------+
1 row in set (0.01 sec)
12 komt hier niet in voor:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
mysql> SELECT LOCATE(CONCAT(',', '12', ','), CONCAT(',', '21,55,3', ',')) > 0 AS found;
+-------+
| found |
+-------+
| 0 |
+-------+
1 row in set (0.00 sec)
+-------+
| found |
+-------+
| 0 |
+-------+
1 row in set (0.00 sec)
En 55 weer wel:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
mysql> SELECT LOCATE(CONCAT(',', '55', ','), CONCAT(',', '21,55,3', ',')) > 0 AS found;
+-------+
| found |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
+-------+
| found |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
Afhankelijk van hoe (en hoe vaak) je dit gebruikt is dit mogelijk niet de meest efficiënte oplossing...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MariaDB [(none)]> SELECT FIND_IN_SET('1', '1,2,3,4');
+-----------------------------+
| FIND_IN_SET('1', '1,2,3,4') |
+-----------------------------+
| 1 |
+-----------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> SELECT FIND_IN_SET('5', '1,2,3,4');
+-----------------------------+
| FIND_IN_SET('5', '1,2,3,4') |
+-----------------------------+
| 0 |
+-----------------------------+
1 row in set (0.00 sec)
+-----------------------------+
| FIND_IN_SET('1', '1,2,3,4') |
+-----------------------------+
| 1 |
+-----------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> SELECT FIND_IN_SET('5', '1,2,3,4');
+-----------------------------+
| FIND_IN_SET('5', '1,2,3,4') |
+-----------------------------+
| 0 |
+-----------------------------+
1 row in set (0.00 sec)
Gewijzigd op 22/02/2017 16:49:36 door Ben van Velzen
En dan ook nog eens kijken wat tussen die ( ) komt te staan als je een paar duizend rows met willekeurige getallen reeksen hebt.
Zo maar een vermoeden dat die tijd op gaat lopen.
Dat sowieso, maar snelheid ga je uit zo'n oplossing sowieso niet halen.