2017-08-28 69 views
0

试图检索所有user_id的那些user_id符合3条件。WordPress的Usermeta选择多个键和值

我的代码是

$sql = " 
SELECT user_id 
FROM {$wpdb->usermeta} 
WHERE (({$wpdb->usermeta}.meta_key = 'job_title' AND {$wpdb- 
>usermeta}.meta_value = '".$job_title."') OR 
({$wpdb->usermeta}.meta_key = 'pmpro_bstate' AND {$wpdb- 
>usermeta}.meta_value = '".$state."') OR 
({$wpdb->usermeta}.meta_key = 'pmpro_baddress2' AND {$wpdb- 
>usermeta}.meta_value = '".$suburb."')) 
GROUP BY 
    user_id 
HAVING 
    COUNT(DISTINCT meta_key)=3"; 

较低()所需要的价值和变量来准确地比较?

是否有更高效的方式来执行此查询?

干杯

回答

0

最好就是做这个用的INNER JOIN:

$sql = "SELECT u.ID 
FROM wp_users u 
INNER JOIN wp_usermeta m1 ON u.ID = m1.user_id AND m1.meta_key = 'job_title' 
INNER JOIN wp_usermeta m2 ON u.ID = m2.user_id AND m2.meta_key = 'pmpro_bstate' 
INNER JOIN wp_usermeta m3 ON u.ID = m3.user_id AND m3.meta_key = 'pmpro_baddress2' 
WHERE m1.meta_value = '".$job_title."' 
AND m2.meta_value = '".$state."' 
AND m3.meta_value = '".$suburb."'" 
+0

是什么让INNER JOIN更好地使用?并且还要感谢你 – David

+0

每个连接都会创建一个更小的数据集,而且处理速度更快(并且MySQL服务器优化处理连接的方式比其他处理多个表的方法更好,因此它比其他方法具有更高的性能优势) 是连接速度较慢的情况(尤其是如果将LEFT和INNER混合在一起),但在这种情况下,读取查询和基于数据处理的速度要快得多,更简单。 –