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')"
);
32
demandé sur Warlock 2013-04-27 11:58:18

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.

35
répondu fthiella 2013-04-27 08:40:37

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.

22
répondu Kovge 2013-04-27 08:56:07

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;
1
répondu Adam Falchetta 2018-02-16 00:50:57

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')")
-2
répondu dave 2013-04-27 08:02:27