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

时间:2013-04-27 07:58:19

标签: 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')"
);

6 个答案:

答案 0 :(得分:46)

我会使用此查询:

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

答案 1 :(得分: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'

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

建议:

使用此表中的索引。 user_id强烈建议您进行索引,并建议成为meta_keymeta_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       |
  +---------+---------------+-----------+

使用$us_name='Kovge' $us_yearselect='2012' $us_reg='GaPa'$us_course='PHP'进行查询的结果:

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

所以它应该有效。

答案 2 :(得分:3)

你也可以使用" AND"而不是" OR"如果你想要应用这两个属性。

select * from tickets where (assigned_to='1') and (status='open') order by created_at desc;

答案 3 :(得分:0)

让我们假设有一个表,该表带有以下针对表(hello)的describe命令- 名称char(100), id整数, 计算整数 城市char(100)。

我们有以下针对MySQL的基本命令-

select * from hello;
select name, city from hello;
etc 

select name from hello where id = 8;
select id from hello where name = 'GAURAV';

现在让我们查看多个条件-

select name from hello where id = 3 or id = 4 or id = 8 or id = 22;

select name from hello where id =3 and count = 3 city = 'Delhi';

这是我们可以在MySQL中使用多个where命令的方式。

答案 4 :(得分:0)

您正在查询一个表,该表被设计为我所看到的“统一内容模型”(UCM)。当首选最大数据灵活性时选择此表结构。这种结构的缺点是效率会受到影响,表通常会因数据过于臃肿而受到影响,并且查询表通常涉及使用称为“枢轴”的技术的聚合函数。

以下是如何使用数据透视来执行查询:(db-fiddle demo)

SELECT user_id 
FROM wp_usermeta
GROUP BY user_id
HAVING MAX(IF(meta_key = 'first_name', meta_value, NULL)) = 'mangesh'
   AND MAX(IF(meta_key = 'yearofpassing', meta_value, NULL)) = '2013'
   AND MAX(IF(meta_key = 'u_city', meta_value, NULL)) = 'n/a'
   AND MAX(IF(meta_key = 'us_course', meta_value, NULL)) = 'programming'

实际上,整个表按 user_id 列分组。在这样做的过程中,形成了一种临时的一对多关系。换句话说,每个相应的 user_id 将有一个或多个行的数据(非线性,非平面),可以被 MySQL 的聚合函数(例如 MAX())查询。< /p>

HAVING 子句是过滤逻辑必须在 GROUP BY 之后的地方(WHERE 过滤发生在 GROUP BY 之前)。在“数据集群”中,您可以通过检查其 meta_key 来隔离数据。当您找到与 meta_key 匹配的行时,您使用它的 meta_value,如果不是,则分配一个有区别的默认值。 IF 处理了聚合中的所有行后,您就知道要查找的行是非 NULL 值——这是通过调用 MAX() 访问的。使用此最大值与您要过滤的实际 值进行比较。根据需要尽可能重复此过滤器以满足您的业务逻辑。

我还应该声明,您没有使用安全编码实践。 mysql_query() 目前已弃用,无论出于何种原因,都不应该存在于任何当前有效的代码中。我建议您使用 mysqli 的面向对象语法并实现带有绑定参数的准备语句以确保安全性/稳定性。

$sql = "SELECT user_id 
        FROM wp_usermeta
        GROUP BY user_id
        HAVING MAX(IF(meta_key = 'first_name', meta_value, NULL)) = ?
           AND MAX(IF(meta_key = 'yearofpassing', meta_value, NULL)) = ?
           AND MAX(IF(meta_key = 'u_city', meta_value, NULL)) = ?
           AND MAX(IF(meta_key = 'us_course', meta_value, NULL)) = ?";

$stmt = $conn->prepare($sql);
$stmt->bind_param('ssss', $us_name, $us_yearselect, $us_reg, $us_course);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_id);
$stmt->fetch();
echo $user_id;

答案 5 :(得分:-2)

你有互相排斥的条件 - 如果meta_key是'first_name',它也不能是'yearofpassing'。很可能你需要你的AND是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')")