2

is_thumbnailデフォルト値がの列がありますno。に基づいて行を選択しますis_thumbnail = 'yes'

    $query = $conn->prepare("SELECT * FROM project_data 
                            WHERE project_id = :projectId 
                            AND is_thumbnail = 'yes' 
                            LIMIT 1");

の値を持つ行がない可能性がありますyesprojectIdその場合、の値に関係なく、最初の行を同じで選択したいis_thumbnail

これで、クエリが返す内容を確認してから、別のクエリを実行できることがわかりました。単一のクエリでこれを行うことが可能かどうか、または PDO を利用できる方法があるかどうか疑問に思っていましたか? PDOを使い始めたばかりです。ありがとう!

サンプルデータ:

id  project_id image                              is_thumbnail 
20  2          50f5c7b5b8566_20120803_185833.jpg  no
19  2          50f5c7b2767d1_4link 048.jpg        no
18  2          50f5c7af2fb22_4link 047.jpg        no
4

2 に答える 2

3
$query = $conn->prepare("SELECT * FROM project_data 
                            WHERE project_id = :projectId 
                            ORDER BY is_thumbnail ASC LIMIT 1");
于 2013-01-15T23:37:11.010 に答える
1

質問で説明されているスキーマが特定の に対して複数の行を示していることを考えると、たとえば、関連する行が多数ある単一のプロジェクトがある場合、ソリューションproject_idのみを使用してもパフォーマンスが向上しない可能性があります。ORDER BY is_thumbnail ...行の並べ替えのコストは潜在的にかなり高くなる可能性があり、インデックスを使用することはできません。必要な代替ソリューションは次のとおりです。

SELECT * FROM (
  SELECT *
  FROM project_data 
  WHERE project_id = :projectId AND is_thumbnail = "yes"
  ORDER BY id DESC
  LIMIT 1

  UNION

  SELECT *
  FROM project_data 
  WHERE project_id = :projectId AND is_thumbnail = "no"
  ORDER BY id DESC
  LIMIT 1
) AS t 
ORDER BY t.is_thumbnail = "yes" DESC
LIMIT 1

このソリューションは理解するのが少し複雑ですが、複合インデックスを使用して(project_id, is_thumbnail, id)、要求された条件に一致する正確に 1 つの行をすばやく見つけることができます。両方が見つかった場合、外側の選択により、yes/no 行の安定した順序が保証されます。

2 つのクエリを発行するだけで、おそらく同等またはそれ以上のパフォーマンスが得られることに注意してください。上記UNIONおよびサブ選択を使用するために、MySQL は一時テーブルを必要としますが、これは忙しい環境ではあまり役に立ちません。

于 2013-01-16T00:04:29.587 に答える