Hallo,


Ik ben bezig om een zoekfunctie te maken met PHP en mySQL.
Er word in meerdere kolommen gezochte en dat doe ik met deze code

<?php
global $wpdb;
$strng			= 'XO';
$table 			= $wpdb->prefix . "posts";
$query			= "SELECT ID, post_title FROM $table WHERE (ID LIKE '%$strng%' OR post_title LIKE '%$strng%')";
$connection 	= mysqli_connect($wpdb->dbhost, $wpdb->dbuser, $wpdb->dbpassword, $wpdb->dbname);
$result			= mysqli_query($connection, $query); 
?>


De variable $strng word straks doormiddel van $_POST gevuld.
Ik krijg nu altijd het resultaat dat ik wil hebben maar wil nog iets toevoegen maar niet precies weet hoe ik dit kan realiseren.

Er zijn twee kolommen "meta_key" en "meta_value".
In de meta_key staat als waarde _sku en in de meta_value staat een bepaalde waarde.

Op die waarde wil ik ook kunnen zoeken maar alleen als in dezelfde record in de meta_key _sku is.
Hoe voeg ik die conditie nu precies toe in de query?
Okay... Dus er is *ten hoogste* één _sku, en niet precies één, dat is namelijk wat ik vroeg :p.

Dan moet je dus terug naar de constructie met een LEFT JOIN, waarbij je de tabellen verbindt met de extra conditie pm.meta_key = '_sku'. Mocht dit bijbehorende record er (nog) niet zijn dan zijn alle kolommen uit de $postmeta tabel gelijk aan NULL, maar krijg je dus wel altijd precies één resultaat (per post id), of er nu een _sku is of niet.

Je krijgt in de bovenstaande query waarschijnlijk heel veel records terug omdat je die twee tabellen enkel met de post_id = ID conditie aan elkaar fietst, dan krijg je waarschijnlijk voor elk record in $postmeta wat overeenkomen met het post ID een record terug, en dat is niet wat je wilt...

En die "1" moet waarschijnlijk bij nader inzien een 0 zijn, anders staat er immers ... OR ... OR 1, en dat is altijd waar :p.

Dus, ten overvloede, met wat aanpassingen ten opzichte van mijn vorige query, en een extra controle of meta_value wel een waarde heeft, zou dit beter moeten werken:
SELECT p.ID, p.post_title
FROM $posts p
LEFT JOIN $postmeta pm ON (pm.post_id = p.ID AND pm.meta_key = '_sku')
WHERE p.post_type = 'product'
AND (
    p.ID LIKE '%$keywords%' OR
    p.post_title LIKE '%$keywords%' OR
    IF(pm.meta_value IS NULL, 0, pm.meta_value LIKE '%$keywords%')
)
ORDER BY p.post_title

Let hierbij dus ook nog steeds op de haken om de OR-statements, want die zijn in jouw bovenstaande query alweer verdwenen.

Reageren