【问题标题】:Using an array in a PHP MySQL WHERE clause在 PHP MySQL WHERE 子句中使用数组
【发布时间】:2013-05-29 22:45:10
【问题描述】:

您好,我正在创建一个带有查询的用户 ID 数组。对于另一个查询,我想从给定的表中进行选择,其中 user_id 是从我的第一个查询创建的数组中的一个。如何在 WHERE 子句中使用数组?

仅供参考:$row_interest 是数组

我的代码:

//Grabs the user id's of the users that have the queried interest
$interest_search_query= "SELECT DISTINCT user_id FROM interests WHERE interest LIKE   
'%".$search_term."%'";
$interest_search_result= mysqli_query($connect, $interest_search_query);
$row_interest= mysqli_fetch_array($interest_search_result);

//Grabs the user information with each user id
$search_query= "SELECT DISTINCT user_id, fname, lname, profile_pic, school FROM users   
WHERE user_id IN $row_interest";

我尝试了“WHERE user_id IN $row_interest”,但它似乎不起作用。我可能做错了什么?

谢谢。

【问题讨论】:

  • 如果您想在where 子句中使用数组,您需要确定它是由单独的where 条件组成,还是您的数组引用单个值的列表健康)状况。在第一种情况下,您需要创建以and(或or)分隔的条件字符串:where field1=value1 and field2=value2。在第二种情况下,您只需将数组的值包含在逗号分隔的列表中:where aField in (value1, value2, value3)

标签: php mysql


【解决方案1】:
$search_query= "SELECT DISTINCT user_id, fname, lname, profile_pic, school FROM users   
WHERE user_id IN (".implode(',',$row_interest).")";

【讨论】:

    【解决方案2】:

    您实际上可以合并两个查询。

    SELECT distinct user_id, fname, lname, profile_pic, school
    FROM users
    WHERE user_id in 
        (SELECT distinct user_id from interests
        where interest like %{search_term}%)
    

    【讨论】:

    • +1 您知道联接或子查询的性能是否更好?我发现连接更简洁,但子查询更强大。
    • 联接通常更快,但在这种情况下,您只需要比较唯一用户的列表,因此子查询的执行应该非常接近联接。 stackoverflow.com/questions/2577174/join-vs-subquery
    • 谢谢,我知道像 oracle 这样昂贵的数据库会在内部将它们都转换为相同的代码,但我不确定 MySQL。
    • MySQL 正在 6.0 中进行一些大修,这是我最后听到的。
    【解决方案3】:

    您可以在 PHP 中为您的 SQL 构建一个 IN() 子句,但由于该集合来自另一个查询,您可以使用 JOIN 来执行此操作。

    编辑: 如果没有您的数据,我无法对此进行测试,但连接类似于

    $search_query= "SELECT DISTINCT u.user_id, u.fname, u.lname, u.profile_pic, u.school 
    FROM user u
    INNER JOIN interests i ON u.user_id = i.user_id
    WHERE i.interest like '%".$search_term."%'";
    

    【讨论】:

    • +1,由于 OP 只是从一个表中查询以在另一个查询中使用而根本不修改该数据,因此 JOIN 甚至是子查询将 much 更好。如果你能举个例子就好了。
    • 我会,但我在 iPad 上,所以打字很困难,而且无法测试 SQL。
    • @Jonathan +1 示例加入已添加到答案。
    【解决方案4】:

    听起来你可以只使用连接,但$row_interest 是一个数组,它在查询中被插入为"Array"。看来您想先构建整个数组

    $rows = array();
    while ($row = mysqli_fetch_array($interest_search_result)) {
        $rows[] = $row['user_id'];
    }
    

    然后你就可以创建你需要的“IN”子句了。

    "WHERE user ID IN (" . implode(",", $rows) . ")"
    

    您的代码容易被注入。您应该使用准备好的语句正确参数化查询。据我了解,在 mysqli 中使用可变数量的参数更难做到这一点,但要记住这一点。

    【讨论】:

    • 不幸的是,您不能将准备好的语句与 IN 子句和数组一起使用。但是我提供的 JOIN 解决方案和@ashwin 提供的子查询解决方案都提供了一个很好的解决方案。我不确定哪个更快,但我更喜欢 join,因为它们更简洁。
    • @PeterWooster 你可以使用IN 和prepared statements;根据数组元素的数量在查询中构建?,并将数组作为参数传递(或根据需要与其他参数合并)。我不确定此时是否可以在 mysqli 中完成,但肯定是 PDO
    • 这应该可以在 mysqli 中使用,但是您不再使用数组,而是一堆或标量,每个参数一个?。
    • @PeterWooster 您曾经能够将bind_param 方法映射到函数调用,但我不确定您是否可以再这样做(因此出现了问题)。 PDOStatement::execute 虽然很容易做到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多