0

私の 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 構文にエラーがあります。3 行目の 'ON a.id = b.userId WHERE b.userId IN (SELECT f.id FROM usergroup' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

実行された 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'

あらゆる種類のヘルプやアドバイスをいただければ幸いです。ありがとう!

4

2 に答える 2

0

そこに括弧の問題があり、不要なサブ選択がある可能性があります。あなたが探しているのは次のとおりだと思います:

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;

しかし、item テーブルと category テーブルの結合についてはよくわかりません。items テーブルのカテゴリに外部がないようで、アイテム ID とカテゴリ ID を結合しているだけです。

ユーザーID =カテゴリIDと言っているユーザーテーブルとカテゴリテーブルの間の結合についても不明です。これらがどのように関連しているのかわかりません。

于 2013-01-14T19:38:01.327 に答える
0

同じ問題に直面している他の人の更新/参照用。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';
于 2013-01-15T20:56:27.533 に答える