Подтвердить что ты не робот

MySQL выбирает запрос с несколькими условиями

Я написал MySQL-запрос, но он, похоже, не работает, потому что результат пуст. Есть ли ошибка в моем коде?

$result = mysql_query(
     "SELECT user_id 
      FROM wp_usermeta 
      WHERE 
         (meta_key = 'first_name' AND meta_value = '$us_name') AND         
         (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') AND 
         (meta_key = 'u_city' AND meta_value = '$us_reg') AND 
         (meta_key = 'us_course' AND meta_value = '$us_course')"
);
4b9b3361

Ответ 1

Я бы использовал этот запрос:

SELECT
  user_id
FROM
  wp_usermeta 
WHERE 
  (meta_key = 'first_name' AND meta_value = '$us_name') OR 
  (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') OR 
  (meta_key = 'u_city' AND meta_value = '$us_reg') OR
  (meta_key = 'us_course' AND meta_value = '$us_course')
GROUP BY
  user_id
HAVING
  COUNT(DISTINCT meta_key)=4

это выберет все user_id, соответствующие всем четырем условиям.

Ответ 2

Решение @fthiella очень элегантно.

Если в будущем вы хотите показать больше, чем user_id, вы можете использовать объединения, и там в одной строке могут быть все данные, которые вам нужны.

Если вы хотите использовать условия AND, и условия находятся в нескольких строках в вашей таблице, вы можете использовать пример JOINS:

SELECT `w_name`.`user_id` 
     FROM `wp_usermeta` as `w_name`
     JOIN `wp_usermeta` as `w_year` ON `w_name`.`user_id`=`w_year`.`user_id` 
          AND `w_name`.`meta_key` = 'first_name' 
          AND `w_year`.`meta_key` = 'yearofpassing' 
     JOIN `wp_usermeta` as `w_city` ON `w_name`.`user_id`=`w_city`.user_id 
          AND `w_city`.`meta_key` = 'u_city'
     JOIN `wp_usermeta` as `w_course` ON `w_name`.`user_id`=`w_course`.`user_id` 
          AND `w_course`.`meta_key` = 'us_course'
     WHERE 
         `w_name`.`meta_value` = '$us_name' AND         
         `w_year`.meta_value   = '$us_yearselect' AND 
         `w_city`.`meta_value` = '$us_reg' AND 
         `w_course`.`meta_value` = '$us_course'

Другое: Рекомендовать использовать подготовленные операторы, потому что mysql_* функции не являются SQL-инъекциями save, и будут устаревать. Если вы хотите изменить свой код как можно меньше, вы можете использовать функции mysqli_: http://php.net/manual/en/book.mysqli.php

Рекомендация:

Используйте индексы в этой таблице. user_id настоятельно рекомендуем быть и индексировать и рекомендовать также meta_key AND meta_value для более быстрого запуска запроса.

Объяснение:

Если вы используете AND, вы "подключаете" условия для одной строки. Поэтому, если вам нужно условие И для нескольких строк, сначала вы должны создать одну строку из нескольких строк, например.

Тесты: Данные таблицы:

          PRIMARY                 INDEX
      int       varchar(255)    varchar(255)
       /                \           |
  +---------+---------------+-----------+
  | user_id | meta_key      | meta_value|
  +---------+---------------+-----------+
  | 1       | first_name    | Kovge     |
  +---------+---------------+-----------+
  | 1       | yearofpassing | 2012      |
  +---------+---------------+-----------+
  | 1       | u_city        | GaPa      |
  +---------+---------------+-----------+
  | 1       | us_course     | PHP       |
  +---------+---------------+-----------+

Результат запроса с $us_name='Kovge' $us_yearselect='2012' $us_reg='GaPa', $us_course='PHP':

 +---------+
 | user_id |
 +---------+
 | 1       |
 +---------+

Поэтому он должен работать.

Ответ 3

У вас есть условия, которые являются взаимоисключающими - если meta_key является "first_name", он также не может быть "yearoppassing". Скорее всего, вам нужно, чтобы ваш И был OR:

$result = mysql_query("SELECT user_id FROM wp_usermeta 
WHERE (meta_key = 'first_name' AND meta_value = '$us_name') 
OR (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') 
OR (meta_key = 'u_city' AND meta_value = '$us_reg') 
OR (meta_key = 'us_course' AND meta_value = '$us_course')")