MySQL选择具有多个条件的查询

Man*_*kar 42 mysql select

我写了一个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')"
);
Run Code Online (Sandbox Code Playgroud)

fth*_*lla 50

我会用这个查询:

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
Run Code Online (Sandbox Code Playgroud)

这将选择user_id满足所有四个条件的所有条件.


Kov*_*vge 25

@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'
Run Code Online (Sandbox Code Playgroud)

其他的事情:建议使用预处理语句,因为mysql_*函数不是SQL注入保存,并且将被弃用.如果您希望尽可能少地更改代码,可以使用以下mysqli_函数:http: //php.net/manual/en/book.mysqli.php

建议:

使用此表中的索引.user_id强烈推荐和索引,并建议成为meta_keyAND meta_value,以便更快地运行查询.

解释:

如果您使用AND'连接'一条线的条件.因此,如果您想要对多行进行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       |
  +---------+---------------+-----------+
Run Code Online (Sandbox Code Playgroud)

与查询的结果$us_name='Kovge' $us_yearselect='2012' $us_reg='GaPa',$us_course='PHP':

 +---------+
 | user_id |
 +---------+
 | 1       |
 +---------+
Run Code Online (Sandbox Code Playgroud)

所以它应该有效.