我正在尝试提取所有用户,包括一些元数据,并希望根据其他一些元数据过滤它们。
涉及两个表: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%"
)