CONVERT functie SQL

  • Goedenavond allemaal,


    Ik ben bezig om een query te schrijven die me zoekresultaten verbeterd aangezien de WP_Query class niet helemaal goed werkt.
    Er moet op meerdere post meta's worden gefiltert, met de WP_Query class kan dit blijkbaar niet want dan kloppen de resultaten niet.


    Nu heb ik een eigen query geschreven welke wel werkt maar de meta_value is standaard een longtext() dus die moet ik converten naar een INT waarde.
    Onderstaande code heb ik inmiddels maar deze lijkt niet te werken, de foutmelding wordt ik ook niet bepaald wijzer van aangezien ik die functie voor het eerst gebruik.


    SQL Query:

    SQL
    SELECT p.*, CONVERT(INT, pm4.meta_value) FROM wp_posts p INNER JOIN wp_postmeta as pm4 ON ( p.ID = pm4.post_id ) WHERE p.post_type = 'kavels' AND p.post_status = 'publish' AND ( pm4.meta_key = '_prijs' AND pm4.meta_value >= '0' AND pm4.meta_value <= '100000' )


    Foutmelding:

    Code
    WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT, pm4.meta_value) FROM wp_posts p INNER JOIN wp_postmeta as pm4 ON ( p.ID = ' at line 1]


    Kan iemand mij op weg helpen wat ik hier precies fout doe, kan er niks over vinden ook namelijk.


    Alvast bedankt!

  • Guest, wil je besparen op je domeinnamen? (ad)
  • Hier is waarschijnlijk een simpelere antwoord op. Neem een stapje terug.


    Vertel ons wat je nou precies wilt ophalen?


    Ik heb nauwelijks zelf queries moeten schrijven, get_posts of WP_Query voldoet aan 9/10 queries

    Met vriendelijke groet,
    Ismail
    enthousiaste game developer

    Bewerkt één keer, laatst door ismail123 ().

  • De correcte syntax in dit geval (voor een typecast) is:


    CONVERT(pm4.meta_value, UNSIGNED)


    UNSIGNED als je enkel met niet-negatieve waarden te maken hebt, maar wellicht is SIGNED veiliger.


    Let ook heel erg goed op met vergelijkingen - als de typen op meerdere plaatsen niet kloppen kan dit voor vreemde resultaten zorgen, vergelijk:

    In het eerste geval heb je te maken met allemaal strings, hier wordt dus de alfabetische (lexicografishe) sortering gebruikt. Hierbij valt '2' niet tussen '0' en '1-met-nog-spul-hier-achter'.


    In het tweede geval heb je te maken met enkel getallen, hier wordt dus een numerieke sortering gebruikt. Daarbij valt 2 wel tussen 0 en 100000.


    Je begeeft je al heel snel op glad ijs als je typen gaat combineren zoals je in bovenstaande SQL doet. Dit gaat waarschijnlijk nog goed omdat MySQL je string (pm4.meta_value) automatisch typecast naar een getal in je vergelijkingen aan het einde van je query.


    Maar netter/beter is dus een wat strictere omgang met typen. En idealiter zat je data al op de goede manier opgeslagen in je database uiteraard.

  • @ismail123


    Nee dit werkt echt niet, ik heb verschillende manieren geprobeerd maar de resultaten kloppen nauwelijks.
    Bij 4 filters werken de eerste 2 werken dan wel en de andere 2 ineens niet meer, geen oplossing dus.


    @mitchellve
    Bedankt voor je feedback, voor zover ik weet is er geen 3e attribute nodig, een type en welk veld moest voldoende zijn.

    Ik wil je graag helpen.


    Kun je me even vertellen wat je wilt ophalen?


    Bijvoorbeeld je wilt de post ophalen waarvan de meta value hoger is dan 5


    Dan kan ik van daaruit vertellen hoe ik dat zou aanpakken.


    Meerdere wegen leiden naar rome

  • @FangorN
    Bedankt voor je feedback, excuus mijn late reactie had nog niet de gelegenheid hier op te reageren.
    Ik heb even je reactie doorgenomen en de website van MySQL gelezen die je gaf als tip.
    Het lijkt erop dat ik beter de CAST functie kan gebruiken, ik weet dat WordPress een optie heeft om type mee te geven (zie onderstaande code).
    Weet niet of die array klopt maar het gaat om de type die je aan de array kan meesturen die dit automatisch goed zet.
    Zonder die type werken de resultaten precies zoals het probleem wat ik nu heb, hun hebben dus ook een oplossing hiervoor.
    Welke dit precies is durf ik niet te zeggen, dit kan ik wel eventueel uitzoeken en delen wanneer ik hier meer van weet.


    PHP
    $args = array(
    	'key'	  => 'meta_key',
    	'value'   => array(
    		'value_1',
    		'value_2',
    	),
    	'type'    => 'numeric',
    	'compare' => 'between',
    );


    @ismail123
    Bedankt voor je reactie, het is zo dat de website op ongeveer 7+ items moet kunnen filteren, dit zijn voornamelijk meta's.
    De filter werkt tot op zekere hoogte wel, maar na 3 of 4 filters houd het op en kan hij niet meer specifiek zoeken.
    We hebben hierop meerdere mogelijkheden besproken, beste optie was toch om een eigen query te schrijven.
    Dit werkt niet alleen sneller maar ook je data kan je goed onderscheiden wat je zoekt omdat de queries worden samengevoegd.
    Heb het idee dat bij de WP_Query class dit niet helemaal zo gaat zoals de bedoeling is, hij stopt op een aantal filters.


    Mocht ik het mis hebben hoor ik het graag natuurlijk, feedback is altijd welkom :)

  • @WMDiensten


    Bedankt voor je waardevolle reactie, hier kan ik wat mee :D
    Op antwoorden zoals 'het werkt niet' heb ik niet veel aan, ik kan dan geen suggesties geven of zeggen je hebt gelijk dit werkt niet met WP_Query


    Er zijn verschillende manieren om op meta's te kunnen filteren, ik heb laatst gefiltert op 4 meta values die elk een verschillende soort relatie heeft.


    Wat ik laatst moest doen is kijken of een gebruiker meedoet aan een conversatie en kijken of hij de nieuwe berichten gelezen heeft of niet.


    Hoe mijn code toen eruit zag om de query op te halen:


    Let op: Deze complexe query is alleen mogelijk vanaf wordpress 4.1
    bron: https://codex.wordpress.org/Cl…ery#Permission_Parameters (stukje naar boven scrollen)


    Je kan een conversatie starten met 2 personen, zie dit als een prive bericht systeem.
    User_1 en user_2 zijn de 2 personen die een conversatie met elkaar aangaan.
    Unseen_user1 en unseen_user2 zijn de personen die de conversatie nog niet hebben gelezen.


    De reden dat ik user_1,user_2,user_x gebruik is omdat als ik users meta van maak en daar users in zet zal acf ze serializen. Dit betekent dat als ik zoek naar een gebruiker ik elke conversatie moet nagaan en unserializen om na te gaan of dit de gebruiker is die ik zoek.


    Wat zijn de 7 meta keys waarbij je een projectie op wilt doen? Wat zijn de relaties met elkaar?
    Moeten ze een bepaalde waarde hebben of moet a gelijk zijn aan b en als dat waar is z gelijk aan x? :P

    Met vriendelijke groet,
    Ismail
    enthousiaste game developer

    Bewerkt één keer, laatst door ismail123 ().

  • @FangorN
    Bedankt voor je feedback, nee ik heb hiervoor gebruik gemaakt van WP_Query, dit leverde alleen niet het gewenste resultaat op. Met een eigen query krijg ik wel correcte resultaten vanuit de query, en mooier is nog, een extra filter bouwen is kinderwerk omdat het weinig moeite kost om hierop te zoeken.


    @ismail123
    We zijn hier om van elkaar te leren, dus als jij of iemand anders hier tips voor heeft kan ik mezelf hierop verbeteren.


    Zo zag mijn array er inderdaad ook wel uit, alleen dit leverde niet op wat ik nodig had uiteindelijk.
    Vermoed dat de data wat verpest is omdat dit een XML waarde was met 5000+ resultaten.
    Dus ik denk niet dat de fout in WordPress zelf zit maar in het ophalen van de data via WordPress (mijn fout dus uiteindelijk).


    Werkte dus wel tot een bepaald niveau maar hierna kon hij niet goed meer sorteren wat met de huidige query wel goed gaat.
    De eigen geschreven query werkt overigens ook nog eens sneller, scheelt niet veel maar je merkt het verschil wel.
    De huidige nieuwe query werkt op een correct niveau en laat alles goed zien, zelfs als ik alle filters gebruik klopt het.


    Vond de array persoonlijk wel netter omdat je dan niet moeite hoeft te doen met een query regel en omzetten van veld waardes etc. Wordt in de toekomst dus gewoon rekening mee gehouden dat het wel werkt mits de data correct opgeslagen wordt.


    Bedankt voor alle feedback, uiteindelijk is het me gelukt met een eigen query.
    Wil @FangorN en @ismail123 bedanken voor hun waardevolle feedback!

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!