MySQL requête select avec plusieurs conditions
j'ai écrit une requête MySQL mais elle ne semble pas fonctionner, parce que le résultat est vide. Est-il une erreur dans mon code?
$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')"
);
4 réponses
j'utiliserais cette requête:
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
tout sélectionner user_id
cela répond aux quatre conditions.
Si à l'avenir vous souhaitez afficher plus de user_id
vous pouvez utiliser joins, et il dans une ligne pourrait être toutes les données dont vous avez besoin.
si vous voulez utiliser AND
conditions et les conditions sont dans plusieurs lignes de votre tableau, vous pouvez utiliser JOINS
exemple:
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'
autre chose: recommander d'utiliser des déclarations préparées, parce que mysql_*
functions n'est pas SQL injection save, et sera déprécié.
Si vous souhaitez modifier votre code le moins possible, vous pouvez utiliser mysqli_
fonctions:
http://php.net/manual/en/book.mysqli.php
Recommandation:
utilisez les index dans ce tableau. user_id
vous recommandons fortement d'être et l'index, et de recommander à l' meta_key
et meta_value
trop, pour accélérer l'exécution de la requête.
L'expliquer:
Si vous utilisez AND
vous "connectez" les conditions pour une ligne. Donc, si vous voulez et condition pour multiple lignes, vous devez d'abord créer une ligne à partir de plusieurs lignes, comme ça.
Tests: Les Données De La Table:
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 |
+---------+---------------+-----------+
Le résultat de la Requête $us_name='Kovge'
$us_yearselect='2012'
$us_reg='GaPa'
,$us_course='PHP'
:
+---------+
| user_id |
+---------+
| 1 |
+---------+
donc ça devrait marcher.
Vous pouvez aussi utiliser "et" au lieu de " ou " si vous voulez que les deux attributs soient appliqués.
select * from tickets where (assigned_to='1') and (status='open') order by created_at desc;
Vous avez des conditions qui sont mutuellement exclusives - si meta_key est 'first_name', il ne peut pas aussi être'yearofpassing'. Très probablement, vous avez besoin de votre et d'être ou de:
$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')")