Toon posts:

[MySQL] Gedeelte van cel terug geven als resultaat.

Pagina: 1
Acties:

Onderwerpen


  • Robert101083
  • Registratie: augustus 2004
  • Laatst online: 06-10-2019
Hallo allen,

Ik heb een (voorbeeld) tabel "data" en die ziet er als volgt uit:
---------------------------------------------------
| id int | params text
---------------------------------------------------
| 0 | aap=ja||
| _ | noot=||
| _ | mies=10
---------------------------------------------------
| 1 | aap=misschien||
| _ | noot=||
| _ | mies=16
---------------------------------------------------

Voor de duidelijkheid: alles moet in de query geregeld worden. Er kan geen gebruik worden gemaakt van php.

Wat wil ik uit mijn query krijgen:
regel1: aap->ja , mies->10
regel2: aap->misschien, mies->10

Deel van de query de ik denk nodig te hebben:
PHP:
1
SELECT *  FROM `data` WHERE `params` REGEXP 'aap=[:alnum:]\\|\\|'


Nou ben ik niet heel goed met regex en uitgebreide queries, dus heb ik dit gelezen:
http://www.brainbell.com/...L_Regular_Expressions.htm

Met als resultaat de bovenstaande query. Ik krijg alleen helemaal geen regels terug (0 rijen retour, dus geen fouten). De inhoud van params is steeds het zelfde, met alleen andere waarden achter de = en voor de ||.

Mijn vraag:
Hoe kan ik de query zo maken dat hij "aap" en "mies" als kolom- veldnaam terug geeft met de waarde die achter de = en voor de || staat?

Alvast bedankt!

Groeten,
Robert

  • Ssander
  • Registratie: december 2009
  • Laatst online: 17-01 20:41
Waarom niet gewoon meerdere velden in je tabel? Als je zoiets doet;

code:
1
2
3
4
id      key       value
1       aap       ja
2       noot      nee
3       mies      misschien


Dan kun je iets doen als;

SQL:
1
SELCT * FROM `table` WHERE `key` = 'aap'

[Voor 1% gewijzigd door Ssander op 25-10-2010 15:54. Reden: Foute UBB code]


  • Robert101083
  • Registratie: augustus 2004
  • Laatst online: 06-10-2019
Ssander schreef op maandag 25 oktober 2010 @ 15:54:
Waarom niet gewoon meerdere velden in je tabel? Als je zoiets doet;

code:
1
2
3
4
id      key       value
1       aap       ja
2       noot      nee
3       mies      misschien


Dan kun je iets doen als;

SQL:
1
SELCT * FROM `table` WHERE `key` = 'aap'
Dat kan helaas niet. De gegevens komen uit een tabel van een component die custom fields heeft. De waarden slaat hij op in het veld "params" als:
field1=aaa||
field2=bbb||
field3=ccc||
enz.

De gegevens uit bovenstaande wil ik gebruiken om een grafiek te tekenen, hier heb ik weer een ander component voor, die alleen een query accepteert om de gegevens op te halen en er vervolgens een grafiek van maakt.

Als "brug" van data tot grafiek heb ik dus alleen een query.

[Voor 19% gewijzigd door Robert101083 op 25-10-2010 16:10]


  • NMe
  • Registratie: februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Robert101083 schreef op maandag 25 oktober 2010 @ 15:27:
Deel van de query de ik denk nodig te hebben:
PHP:
1
SELECT *  FROM `data` WHERE `params` REGEXP 'aap=[:alnum:]\\|\\|'
Waarom escape je je pipe-tekens dubbel?

[Voor 68% gewijzigd door NMe op 25-10-2010 16:14]

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


  • Woy
  • Registratie: april 2000
  • Niet online

Woy

Moderator Devschuur®
Tja het huidige model is niet echt optimaal om dit soort dingen te doen, dat ondervind je nu zelf ook al. Je hebt een Key/Value relatie binnen 1 veld, en dus zul je aan de gang moeten met regular expressions of met string functions. Of als je alleen een bepaalde parameter wil hebben kun je ook een veld selecteren die begint met de gewenste string 'aap=' en de rest d.m.v. een wildcard acceptere ( WHERE field LIKE 'aap=%' ) bijvoorbeeld

Zoals NMe al opmerkt escape je je | nu dubbel, of is dat doordat je het uit een PHP script gecopy paste hebt?

Om een gedeelte van de string te selecteren, of vergelijken kun je gebruik maken van de string functions die MySQL bied: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

[Voor 16% gewijzigd door Woy op 25-10-2010 16:46]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Janoz
  • Registratie: oktober 2000
  • Laatst online: 16:30

Janoz

Moderator Devschuur®

!litemod

@NMe &Woy aangezien er uiteindelijk een slash in de aan te bieden string terecht moet komen en het zelf het escape teken is zul je het teken moeten escapen. Als de query in php zou komen te staan (binnen dubbele quotes) dan zouden er 4 slashes moeten staan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Woy
  • Registratie: april 2000
  • Niet online

Woy

Moderator Devschuur®
Janoz schreef op maandag 25 oktober 2010 @ 18:15:
@NMe &Woy aangezien er uiteindelijk een slash in de aan te bieden string terecht moet komen en het zelf het escape teken is zul je het teken moeten escapen. Als de query in php zou komen te staan (binnen dubbele quotes) dan zouden er 4 slashes moeten staan.
|:( natuurlijk, escaping is soms best een *(&%

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • pedorus
  • Registratie: januari 2008
  • Niet online
Dat het verder niet werkt ligt niet zo zeer aan het escapen (anders krijg je vanzelf "Got error 'empty (sub)expression' from regexp"), maar regexp levert slechts 1 of 0 op en niet een splitsing in kolommen. En het is [[:alnum:]]* denk ik.

Je kunt dit vast oplossen met functies als mid, instr, right en reverse, maar echt mooi wordt het er niet van. Eigenlijk is er gewoon iets mis met de component die de data opslaat. :p

Vitamine D tekorten in Nederland | Middelen tegen corona


  • Voutloos
  • Registratie: januari 2002
  • Niet online
Robert101083 schreef op maandag 25 oktober 2010 @ 16:04:
De gegevens uit bovenstaande wil ik gebruiken om een grafiek te tekenen, hier heb ik weer een ander component voor, die alleen een query accepteert om de gegevens op te halen en er vervolgens een grafiek van maakt.

Als "brug" van data tot grafiek heb ik dus alleen een query.
Als de records verder geen gekke 'random' mutaties kunnen ondergaan kan je ook een eigen tabel met een fatsoenlijk datamodel introduceren. :) Op lange termijn wordt het er niet duidelijker van, maar dat kan enkel beter als de componenten meer samenwerken cq. netter data opslaan.

{signature}


  • Robert101083
  • Registratie: augustus 2004
  • Laatst online: 06-10-2019
Omdat het om een kleine site gaat wat ik snel voor iemand in elkaar wilde zetten ben ik nu het component dat de grafiek maakt iets aan het aanpassen zodat hij met explode de gegevens uit de database haalt. Dat is bijna klaar. Moet alleen nog wat overbodige key's uit de array halen die gemaakt wordt met de explode.

Ik weet dat ik eerder had aangegeven geen php te willen gebruiken, maar ik had gehoopt het met een query op te kunnen lossen.

Bedankt voor de reacties!

  • Janoz
  • Registratie: oktober 2000
  • Laatst online: 16:30

Janoz

Moderator Devschuur®

!litemod

Het lijkt mij voor de hand liggender om juist die andere plugin aan te passen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Robert101083
  • Registratie: augustus 2004
  • Laatst online: 06-10-2019
Janoz schreef op dinsdag 26 oktober 2010 @ 16:16:
Het lijkt mij voor de hand liggender om juist die andere plugin aan te passen.
In dit geval, denk ik, niet. Het eerste component is wèl de gene die niet "netjes" werkt. Maar is veeeeel meer werk om aan te passen. Een "simpele" bewerking van de gegevens die uit de database worden gehaald, voordat de grafiek getekend wordt, is veel sneller gedaan en makkelijker.

Ik weet het, het is niet wat jullie willen horen. Maar de site gaat maar even gebruikt worden door niet al te veel mensen. :)

  • BrZ
  • Registratie: maart 2000
  • Laatst online: 21:07
Robert101083 schreef op woensdag 27 oktober 2010 @ 00:37:
Maar de site gaat maar even gebruikt worden door niet al te veel mensen. :)
Gevaarlijke uitspraak ;)

Met REGEXP gaat het niet werken. Voor zover ik weet kan je in MySQL met een regexp alleen wel of niet matchen, je kan er niet een bepaald stuk uit een string mee weergeven. Denk dat je het het beste met substrings kan doen. Je kan zoiets doen:
SQL:
1
2
3
4
5
SELECT id,
SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'aap=', -1), '||', 1) AS aap,
SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'noot=', -1), '||', 1) AS noot,
SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'mies=', -1), '||', 1) AS mies
FROM test


Geeft met wat testdata deze output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT * FROM test;
+----+---------------------------------+
| id | params                          |
+----+---------------------------------+
|  1 | aap=ja||noot=||mies=10||        |
|  2 | aap=misschien||noot=||mies=16|| |
+----+---------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT id,
    -> SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'aap=', -1), '||', 1) AS aap,
    -> SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'noot=', -1), '||', 1) AS noot,
    -> SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'mies=', -1), '||', 1) AS mies
    -> FROM test;
+----+-----------+------+------+
| id | aap       | noot | mies |
+----+-----------+------+------+
|  1 | ja        |      | 10   |
|  2 | misschien |      | 16   |
+----+-----------+------+------+
2 rows in set (0.00 sec)


Dit werkt op deze manier alleen als alle rows in de database exact dezelfde layout hebben, met overal dezelfde fields dus.

  • Robert101083
  • Registratie: augustus 2004
  • Laatst online: 06-10-2019
Bedankt BrZ! Dit werkt inderdaad perfect. De regel met noot, de middelste, kan er zelf tussenuit, dan werkt het ook.

SQL:
1
2
3
4
SELECT id,
SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'aap=', -1), '||', 1) AS aap,
SUBSTRING_INDEX(SUBSTRING_INDEX(params, 'mies=', -1), '||', 1) AS mies
FROM test
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee