MySQL zoek query filter op waarde maar geen alle meta_value terug
Door
Bryan De Baar
op 24-05-2020 13:46
gewijzigd op 24-05-2020 13:47
3.685 views
Goedemiddag,
Ik maak gebruik van deze query
SELECT *
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON (pm.post_id = p.ID AND pm.meta_key = '_sku')
WHERE p.post_title LIKE '%rad%'
OR IF(pm.meta_value IS NULL, 0, pm.meta_value LIKE '%rad%')
Met deze query zoek ik in de post_title en in de meta_value kolom als kolom meta_key de waarde _sku bevat.
Zo kan ik zoeken op naam en artikelnummer.
De query zoals hierboven geeft als resultaat
- Radio
- 5876gh7
Maar ik wil ook de price en de thumb_id hebben uit de kolom meta_value.
Als ik het rood gemarkeerde weghaal
LEFT JOIN wp_postmeta pm ON [color="#ff0000"]([/color]pm.post_id = p.ID [color="#ff0000"]AND pm.meta_key = '_sku')[/color] krijg ik alle meta_values terug maar dan word er ook in alle meta_values gezocht wat alleen mag als de meta_key _sku is.
Je wilt informatie uit wp_postmeta, dus daar zul je je SELECT op uit moeten voeren.
Je condities komen zowel uit wp_posts alsook wp_postmeta. Specifiek, dit levert (in beide gevallen) bepaalde id's uit de wp_posts tabel op.
Dit levert mogelijk meerdere id's op (als je bijvoorbeeld op "7" zoekt krijg je beide posts terug omdat "7" in beide _sku's voorkomt), dus waarschijnlijk wil je ook sorteren op post_id, en dan op meta_id ofzo.
Het volgende werkt volgens mij:
SELECT p.ID, p.post_title, m.meta_id, m.meta_key, m.meta_value
FROM wp_posts p
LEFT JOIN wp_postmeta m ON (m.post_id = p.ID)
WHERE EXISTS (SELECT 1 FROM wp_posts WHERE post_title LIKE '%rad%' AND ID = p.ID)
OR EXISTS (SELECT 1 FROM wp_postmeta WHERE meta_key = '_sku' AND meta_value LIKE '%rad%' AND post_id = p.ID)
ORDER BY p.ID, m.meta_id;
Maar dit is weer een vraagstuk over de wp_posts tabel, hier is recent een soortgelijke vraag over gesteld en mogelijk heeft WordPress hier out-of-the-box functionaliteit (interne link) voor.
Voordat je dit soort queries in elkaar loopt te hacken zou je eigenlijk moeten kijken of je dit met standaard WP functionaliteit op kunt lossen.
Dit ga ik even proberen :-). Hoewel het wel een Wordpress tabel is ail ik deze query buiten Wordpress gebruiken.
Vandaar dat ik niet de standaard wordpress functies gebruik.
[size=xsmall]Toevoeging op 24/05/2020 16:30:49:[/size]
Dit werkt inderdaad Thomas :)
Omdat ik de post_title nu even vaak terug krijg als de meta_value heb ik GROUP BY post_title geprobeerd omdat ik de post_title natuurlijk maar 1x hoef te hebben. Maar dan krijg ik maar 1 record terug.
Kan ik dit het beste oplossen met PHP en controleren of deze al bestaat of kan dit worden aangeven in de query?
Meerdere manieren om dit op te lossen, bijvoorbeeld:
- bouw eerst een hulparray in PHP-met de query-resultaten (zie tweede thread), of
- houd on-the-fly bij in welke rubriek je zat (eerste thread of zoals @Jop hierboven aangeeft), hierbij moet je dus wel sorteren op deze rubriek.
@Adoptive: alweer eerst een GROUP_CONCAT en dan een explode? :/
Kan ik dit het beste oplossen met PHP en controleren of deze al bestaat of kan dit worden aangeven in de query?
Als je de price en thumb_id nodig hebt zoals je in je oorspronkelijke bericht aangeeft zul je deze informatie nog stees op moeten halen. Ik zou dit "gestructureerd" doen (en dit niet op één hoop gooien zodat de betekenis van de informatie min of meer verloren gaat) zodat je later deze data nog (aan de PHP-kant) aan kunt passen zonder de query te veranderen.
Het zou niet nodig moeten zijn dat je informatie die uit de database afkomstig is nog moet bewerken / "uit moet pakken" om deze te kunnen gebruiken. Deze zou direct gebruiksklaar, of op zijn minst "direct leesbaar", moeten zijn.
Nou nee voor iets simpels hoeft dat niet per se, maar ik vind het gewoon tegennatuurlijk om voor een bepaalde aanpak te kiezen (GROUP_CONCAT) waar je vervolgens weer (extra) code voor moet schrijven (in de vorm van explode).
Dit is zoiets als een oplossing verzinnen voor een probleem dat je zelf introduceert.
Het werkt verder prima daar niet van, maar ik zou het zo simpelweg niet aanpakken :).
Ik zou dan een array willen aanmaken en die dan terug sturen en met jQuery de opmaak willen maken.
Dat word dan een array gevuld met arrays?
Hoe kan ik dan per post_title met bijhorende meta_value's een array in de array maken?