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')"
);
Ответы
Ответ 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')")