php - MySQL 添加到查询会使现有部分无效

标签 php mysql sql

数据库:

  • xx_users(id、姓名、user_id、电子邮件、位置)
  • xx_questions(id、问题、描述、user_id)

原代码:

$friends = $facebook->api('/me/friends');
$arr= $friends['data'];
$friend_ids_arr = array();
foreach($arr as $friend) {
    $friend_ids_arr[] = $friend['id'];
}

$sql = "SELECT * FROM xx_questions WHERE user_id IN (" . implode(',', $friend_ids_arr) . ") OR user_id = '$user' ORDER BY time DESC";

新代码:

$friends = $facebook->api('/me/friends');
$arr= $friends['data'];
$friend_ids_arr = array();
foreach($arr as $friend) {
    $friend_ids_arr[] = $friend['id'];
}
    $sql = "SELECT *
    FROM xx_questions q JOIN xx_users u ON
        q.user_id = u.user_id
    WHERE q.user_id IN (implode(',', $friend_ids_arr)) OR // STEP 1
        q.user_id = '$user' OR // STEP 2
        u.location = (SELECT location FROM xx_users WHERE user_id = $user) // STEP 3
    ORDER BY q .time DESC";

    $data = mysql_query($sql) or die(mysql_error());
    while ($row = mysql_fetch_assoc($data)) {
        echo $row[id];
        }

如果出现以下三种情况中的任何一种,我将尝试从 xx_questions(已由用户发布)中选择问题:

  1. 发布者的 user_id 与当前用户的 friend 之一匹配的那些值(即发布者和用户是 friend )
  2. 发布者的 user_id 与用户的匹配的那些值(即发布者是用户)
  3. 发帖人的位置与当前用户的位置相匹配的那些值(即发帖人和用户当前在同一个城市)

我最初实现了步骤 1 和 2,但是当我添加步骤 3 时,发生了两件事:

  1. 第 1 步停止工作(即仅返回当前用户和同一城市的人的帖子)
  2. 在 while 循环中回显的 $row[id] 是 xx_users,而不是 xx_questions。我试过 $row[q.id] 但无济于事。

知道哪里出了问题吗?

最佳答案

在你的秒查询中,你的 implode 语句不在字符串之外。

"WHERE q.user_id IN (implode(',', $friend_ids_arr)) OR" // STEP 1

虽然 php 可以将变量添加到双引号字符串($x = "test $test test" $test 将更改为 $test 的值),但它不能转义函数。所以这将返回

"WHERE q.user_id IN (implode(',', Array)) OR" // STEP 1

你应该使用:

"WHERE q.user_id IN (".implode(',', $friend_ids_arr).") OR" // STEP 1

最后您使用的是 SELECT *,如果两个表都有一个 Id 列,则只返回一个。最好使用 SELECT q.* 只获取问题行,或者使用 SELECT q.*, u.location 从用户获取整个问题行和位置表。

我也检查了你的查询,它应该做你想做的

$sql = "SELECT q.*, u.location
            FROM xx_questions q 
            JOIN xx_users u 
            ON q.user_id = u.user_id
            WHERE q.user_id IN (".implode(',', $friend_ids_arr).") OR // STEP 1
            q.user_id = $user OR // STEP 2
            u.location = (SELECT location FROM xx_users WHERE user_id = $user) // STEP 3
            ORDER BY q.time DESC";

我唯一改变的是 implode 并删除 $user 周围的 ''。这是因为 $user 实际上不是一个整数而是一个包含数字的字符串,但附加了一些额外的空格(例如“1”而不是“1”);

关于php - MySQL 添加到查询会使现有部分无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931385/

相关文章:

php - 无法将 php 链接到数据库

python - 使用 python 的字典创建一个通用的 MySQL 插入字符串

php - 从 Doctrine 注释生成 UML 类图的工具

php - ERR_TOO_MANY_REDIRECTS 使用 Facebook 登录 - PhP 和 MySql

php - onmouseover php 对象

mysql - Envers revinfo 表为空,但 _aud 表正常 - Spring Boot

php - 声明和使用 PHP 命名空间

mysql - 如何组合两个查询,以便一个查询的结果将用于另一个查询?

PHP,SQL - 获取表 id = 用户 id 的数据并计算行 = 用户 id 的其他表

php - 在获取中添加?