1

我正在尝试提取所有用户,包括一些元数据,并希望根据其他一些元数据过滤它们。

涉及两个表:wp_user,以 ID 作为唯一相关字段,以及wp_usermeta

umeta_id | user_id | meta_key | meta_value.

我目前的解决方案如下所示:

I INNER JOIN 使用与我要过滤的键匹配的特定 usermeta 条目的用户。然后通过一个 WHERE 完成过滤,我在其中比较(使用 LIKE)这些 meta_values 与多个字符串。

结果:

多行,每个通过过滤的用户一行(其元值与 LIKE 成功匹配)。

问题:

这行得通,我确实得到了我需要的结果。但是,只有少数用户(因此在 usermeta 中有大约 100 行),查询需要大约 2 秒。查询的复杂性令人恐惧。如何重写此 SQL 以获得相同的结果,但又没有不良的扩展潜力?

我试过了:

只加入一次用户元是有意义的。我可以做一个单一的 INNER JOIN,但这会为结果中的每个用户提供几行。而且我也不知道这将如何与过滤一起发挥作用。我也尝试阅读有关 GROUP 和 CONCAT 功能的信息,但我的 MySQL 知识还不够高,无法自己弄清楚。

SQL:

SELECT 
    u.ID as ID, 
    um_6.meta_value,
    um_7.meta_value,
    um_8.meta_value,
    um_9.meta_value
FROM 
    wp_users u

INNER JOIN wp_usermeta um_1  ON u.ID=um_1.user_id AND um_1.meta_key  = "meta_key_1"
INNER JOIN wp_usermeta um_2  ON u.ID=um_2.user_id AND um_2.meta_key  = "meta_key_2"
INNER JOIN wp_usermeta um_3  ON u.ID=um_3.user_id AND um_3.meta_key  = "meta_key_3"
INNER JOIN wp_usermeta um_4  ON u.ID=um_4.user_id AND um_4.meta_key  = "meta_key_4"
INNER JOIN wp_usermeta um_5  ON u.ID=um_5.user_id AND um_5.meta_key  = "meta_key_5"
INNER JOIN wp_usermeta um_6  ON u.ID=um_6.user_id AND um_6.meta_key  = "meta_key_6"
INNER JOIN wp_usermeta um_7  ON u.ID=um_7.user_id AND um_7.meta_key  = "meta_key_7"
INNER JOIN wp_usermeta um_8  ON u.ID=um_8.user_id AND um_8.meta_key  = "meta_key_8" 
INNER JOIN wp_usermeta um_9  ON u.ID=um_9.user_id AND um_9.meta_key  = "meta_key_9"

WHERE 
( um_1.meta_value LIKE "%example_value_1%" ) AND 
( um_2.meta_value LIKE "%example_value_2%" ) AND 
( um_3.meta_value LIKE "%example_value_3%" ) AND
( um_4.meta_value LIKE "%example_value_4%" ) AND

(
    um_5.meta_value LIKE "%string_1%" OR 
    um_5.meta_value LIKE "%string_2%" OR 
    um_5.meta_value LIKE "%string_3%" OR 
    um_5.meta_value LIKE "%string_4%"
)
4

0 回答 0