SQL-запрос в WordPress – получение невозможной ошибки WHERE

Я не получаю никакого результата в SQL-запросе ниже. Я пытаюсь найти user_id пользователей с пользовательскими полями usermeta.

SELECT DISTINCT user_id FROM wp_usermeta WHERE ( ( (meta_key='user_school_subjects' AND meta_value LIKE '%history%') OR (meta_key='user_professional_courses' AND meta_value LIKE '%history%') OR (meta_key='user_language_tutoring' AND meta_value LIKE '%history%') OR (meta_key='user_music_tutoring' AND meta_value LIKE '%history%') ) AND (meta_key='user_gender' AND meta_value='male') ) 

Когда я запускаю запрос в SQL PHPMYADMIN, я получаю сообщение об ошибке -> Impossible WHERE Query

Что случилось с запросом? Пожалуйста, помогите мне исправить ошибку в вышеуказанном запросе.

UPDATE: вот полный поисковый запрос, построенный с использованием формы.

 global $wpdb; $user_ids = array(); $user_query = null; if (isset($_REQUEST['search']) && !empty($_REQUEST['search']) ) { $s = $_REQUEST['search']; $user_query .= "((meta_key='first_name' AND meta_value LIKE '%".$s."%') OR (meta_key='last_name' AND meta_value LIKE '%".$s."%') OR (meta_key='display_name' AND meta_value LIKE '%".$s."%') OR (meta_key='user_nicename' AND meta_value LIKE '%".$s."%') OR (meta_key='user_login' AND meta_value LIKE '%".$s."%'))"; } if (isset($_REQUEST['email']) && !empty($_REQUEST['email']) ) { $s = $_REQUEST['email']; if ($user_query) { $user_query .= " AND (meta_key='user_email' AND meta_value='".$s."')"; } else { $user_query .= "(meta_key='user_email' AND meta_value='".$s."')"; } } if (isset($_REQUEST['subject']) && $_REQUEST['subject'] !='' ) { $s = $_REQUEST['subject']; if ($user_query) { $user_query .= " AND ((meta_key='user_school_subjects' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_professional_courses' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_language_tutoring' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_music_tutoring' AND meta_value LIKE '%".$s."%'))"; } else { $user_query .= "((meta_key='user_school_subjects' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_professional_courses' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_language_tutoring' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_music_tutoring' AND meta_value LIKE '%".$s."%'))"; } } if (isset($_REQUEST['location']) && $_REQUEST['location'] !='' ) { $s = $_REQUEST['location']; if ($user_query) { $user_query .= " AND ((meta_key='user_address' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_zipcode' AND meta_value LIKE '%".$s."%'))"; } else { $user_query .= "((meta_key='user_address' AND meta_value LIKE '%".$s."%')"; $user_query .= " OR (meta_key='user_zipcode' AND meta_value LIKE '%".$s."%'))"; } } if (isset($_REQUEST['gender']) && !empty($_REQUEST['gender']) ) { if ( $_REQUEST['gender'] != '') { $s = $_REQUEST['gender']; if ($user_query) { $user_query .= " AND (meta_key='user_gender' AND meta_value='".$s."')"; } else { $user_query .= "(meta_key='user_gender' AND meta_value='".$s."')"; } } } if (isset($_REQUEST['status']) && !empty($_REQUEST['status']) ) { if ( $_REQUEST['status'] == 'active') { $s = $_REQUEST['status']; if ($user_query) { $user_query .= " AND ( (meta_key='user_membership' AND meta_value='active')"; $user_query .= " OR (meta_key='user_availability' AND meta_value='available'))"; } else { $user_query .= "((meta_key='user_membership' AND meta_value='active')"; $user_query .= " OR (meta_key='user_availability' AND meta_value='available'))"; } } elseif ( $_REQUEST['status'] == 'inactive') { $s = $_REQUEST['status']; if ($user_query) { $user_query .= " AND ((meta_key='user_membership' AND meta_value='".$s."')"; $user_query .= " OR (meta_key='user_availability' AND meta_value='unavailable'))"; } else { $user_query .= "((meta_key='user_membership' AND meta_value='".$s."')"; $user_query .= " OR (meta_key='user_availability' AND meta_value='unavailable'))"; } } } if (isset($_REQUEST['nationality']) && $_REQUEST['nationality']!='any' ) { $s = $_REQUEST['nationality']; if ($user_query) { $user_query .= "AND (meta_key='user_nationality' AND meta_value='".$s."')"; } else { $user_query .= "(meta_key='user_nationality' AND meta_value='".$s."')"; } } if (!empty($user_query)) { $wp_users = $wpdb->get_results("SELECT DISTINCT user_id FROM $wpdb->usermeta WHERE ($user_query)"); } 

EDIT: вы можете найти ответ здесь: https://stackoverflow.com/questions/3735176/compex-mysql-left-join-using-multiple-entries-from-meta-tables

Посмотрите на свои условия:

 WHERE ( ( (meta_key='user_school_subjects' AND meta_value LIKE '%history%') OR (meta_key='user_professional_courses' AND meta_value LIKE '%history%') OR (meta_key='user_language_tutoring' AND meta_value LIKE '%history%') OR (meta_key='user_music_tutoring' AND meta_value LIKE '%history%') ) AND (meta_key='user_gender' AND meta_value='male')) 

Нет никакого способа, чтобы у вас был мета-ключ, соответствующий одному из них –

  • user_school_subjects ,
  • user_professional_courses ,
  • user_language_tutoring ,
  • user_music_tutoring

… что также соответствует этому –

  • user_gender

Если ключ соответствует любому из первых четырех, и он должен соответствовать одному для этого блока, чтобы он был истинным, он автоматически не соответствует пятому. Вы никогда не сможете получить true из этого. Этот пункт – именно то, что говорит сервер, – невозможно.

Я бы предложил WP_User_Query но я не думаю, что он способен к логике, в которой вы нуждаетесь.

Вам нужно JOIN на столе, что-то вроде этого:

 SELECT DISTINCT wpmu.user_id FROM wp_usermeta AS wpmu LEFT JOIN wp_usermeta AS gender ON wpmu.user_id = gender.user_id WHERE ( ( (wpmu.meta_key='user_school_subjects' AND wpmu.meta_value LIKE '%history%') OR (wpmu.meta_key='user_professional_courses' AND wpmu.meta_value LIKE '%history%') OR (wpmu.meta_key='user_language_tutoring' AND wpmu.meta_value LIKE '%history%') OR (wpmu.meta_key='user_music_tutoring' AND wpmu.meta_value LIKE '%history%') ) AND (gender.meta_key='user_gender' AND gender.meta_value='male') ) 

Я не могу поклясться, что 100%, так как я не могу проверить это без ваших данных, но это идея.