1

次のテーブルがあります

マイリストテーブル

playerId listId type
 50       10     0
 51       10     0

プレーヤー

id  x  xx etc
50  x  xx etc
51  x  xx etc

listId と type を指定してクエリを実行すると、その listId と type に関連するすべてのプレーヤーのリストが取得されます

try {
    $conn = $this->GetDBConnection();
    $type = 0; // 0 REQUEST BY PLAYERS
    $statement = $conn->prepare('SELECT p.* FROM myListTable c, players p WHERE (c.listId = :listId ) AND (c.type = :type) AND ( p.id = c.playerId) ');
    $statement->bindParam(':listId', $listId, PDO::PARAM_INT);
    $statement->bindParam(':type', $type, PDO::PARAM_INT);
    $statement->execute();
    if(!($row = $statement->fetchAll(PDO::FETCH_ASSOC))) {
        return false;
    }
    $conn = null;
} catch(PDOException $e) {
    throw $e;
}

これは私にfalseを返しているだけです。このクエリを修正するにはどうすればよいですか?

4

1 に答える 1

4

間違いの1つは、準備クエリのタイプミスです。

$statement = $conn->prepare('SELECT p.* 
    FROM myListTable c, players p 
    WHERE (c.listId = :c.listId ) 
        AND (c.type = :type) 
        AND ( p.id = c.playerId) ');

:c.listIdだけである必要があります:listId

2つ目は、typeMySQLの予約語です。クエリ内でエスケープするには、バックティックが必要です。

playersもう1つは、テーブルから値を選択するだけなので、aJOINが優先されます。

クエリは次のようになります。

SELECT p.*
FROM players p
JOIN myListTable c
    ON (p.id = c.playerId)
WHERE (c.listId = :c.listId)
    AND (c.`type` = :type)
于 2013-03-18T08:30:09.807 に答える