【问题标题】:CDbCommand - Three Tables Join and IN Clause SyntaxCDbCommand - 三表连接和 IN 子句语法
【发布时间】:2013-01-14 19:25:30
【问题描述】:

在我的 Yii 应用程序中,我有以下数据库结构:

Table user (id, firstName, lastName)
Table category (id, categoryName)
Table item (id, categoryId, name)
Table usergroup(id, userId, groupName)

我正在尝试运行以下查询:

$sql = 'SELECT a.id, a.firstName, a.lastName, b.id, b.categoryName, c.id, c.name
        FROM user AS a
        INNER JOIN (category AS b ON a.id = b.userId
        WHERE b.userId IN (SELECT f.id FROM usergroup f WHERE f.userId=:currentUserId))
        INNER JOIN item AS c ON b.id = c.categoryId
        WHERE c.name LIKE :listedName';

$command=$connection->createCommand($sql); 

$currentUserId = Yii::app()->user->id;
//binding :currentUserId  
$command->bindParam(":currentUserId", $currentUserId,PDO::PARAM_STR);

$listedItemName = $data->name;
//binding :listedItemName 
$command->bindParam(":listedName", $listedName,PDO::PARAM_STR);

$dataReader=$command->query();

但是,我得到以下异常:

CDbException

CDbCommand 未能执行 SQL 语句:SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 中有错误 句法;检查与您的 MySQL 服务器版本相对应的手册 在'ON a.id = b.userId WHERE b.userId IN附近使用正确的语法 (在第 3 行从用户组中选择 f.id。

执行的 SQL 语句是:

SELECT a.id, a.firstName, a.lastName, b.id, b.categoryName, c.id, c.name FROM user AS a INNER JOIN (category AS b ON a.id = b.userId WHERE b.userId IN (SELECT f.id FROM usergroup f WHERE f.userId=:currentUserId)) INNER JOIN item AS c ON b.id = c.categoryId WHERE c.name LIKE :listedName. Bound with :currentUserId='2', :listedName='Oliver Twist'

我们将不胜感激任何形式的帮助或建议。谢谢!

【问题讨论】:

    标签: mysql sql yii


    【解决方案1】:

    您似乎有一些括号问题以及可能不必要的子选择。我猜你正在寻找的是:

    SELECT a.id, a.firstName, a.lastName, b.id, b.categoryName, c.id, c.name
    FROM user AS a
    INNER JOIN category AS b ON a.id = b.userId
    INNER JOIN usergroup AS f ON f.userID = a.id
    INNER JOIN item AS c ON b.id = c.categoryId
    WHERE c.name LIKE :listedName'
    AND  f.userID=:currentUserId;
    

    但是,我不清楚项目表和类别表之间的连接。您似乎在 items 表中没有为 category 设置外文,只是加入了 item id 和 category id。

    我也不清楚你在用户表和类别表之间的连接,你说用户 id = 类别 id。我看不出这些有什么关系。

    【讨论】:

    • category有很多item,item.categoryId是category.id相关的FK。谢谢。
    • "WHERE b.userId IN (SELECT f.id FROM usergroup f WHERE f.userId=:currentUserId)",我在这里尝试编写 WHERE / IN 条件。我期望 SELECT 条件将为 IN 子句返回一个类似 (2,3,4) 的数组。
    • @MushtaqHussain 您没有在原始问题的故事描述中显示 categoryId 字段,因此我很困惑。
    • 你说得对,我自己错过了 item 表中的 categoryId。我编辑过同样的。感谢您指出。
    • @MushtaqHussain 我仍然不清楚 item/category 表和 user/usergrpup 表之间的连接。您如何将用户/组与项目和/或类别相关联?
    【解决方案2】:

    用于更新/参考面临相同问题的任何其他人。后来我发现SQL WHERE CLAUSE只能用在语句末尾的问题,我把第一个WHERE子句改成了AND条件。这是工作查询:

    $sql = 'SELECT a.id, a.firstName, a.lastName, b.id, b.categoryName, c.id, c.name
            FROM user AS a
            INNER JOIN (category AS b ON a.id = b.userId
            AND b.userId IN (SELECT f.id FROM usergroup f WHERE f.userId=:currentUserId))
            INNER JOIN item AS c ON b.id = c.categoryId
            WHERE c.name LIKE :listedName';
    

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多