0

列の1つに不明な数の異なる値を持つすべての行を選択できるSQL SELECTステートメントをPHPファイルに作成しようとしています。よりよく説明するために、正確な状況を言います。データベースに 3 つのテーブルがあります。テスト、カテゴリ、セクション。各テストはカテゴリに属し、約 50 のカテゴリがあり、各カテゴリはセクションに属し、10 のセクションがあります。ただし、テスト テーブルには、属するカテゴリの列しかありません。セクション内のすべてのテストを表示できるようにしたいと考えています。

物事を明確にするために:

SELECT * FROM tests WHERE category = '$categoryId' ORDER BY id ASC

これにより、特定のカテゴリのすべてのテストを選択できますが、選択したセクションに応じて、OR で区切られたこのステートメントにカテゴリ ID を入れる、ある種のループを作成したいと考えています。ありがとうございました。

4

3 に答える 3

2
SELECT t.* 
FROM tests t
    JOIN category c on t.category = c.id AND c.section = ' . $section . '
ORDER BY t.id ASC

これは、本番環境で $section パラメータをサニタイズする必要がある方法を示すためのものです。

テーブルを結合して、プログラムによるループを介して強力なリレーショナル データベース機能を利用するという考え方です。

内部的には、RDBMS がループを実行し、JOIN された各テーブルの中間結果セットを計算します。

于 2013-04-20T20:08:30.157 に答える
0

1 つのセクションですべてのテストを選択する場合は、カテゴリ ID で or ステートメントを使用しないで、これらのテーブルで結合を使用する必要があります。

SELECT tests.* FROM (tests JOIN categories ON tests.category = categories.id) WHERE categories.section = $section

$sectionテストを選択したいセクションのIDです。関心のある列のみを選択する代わりに、使用する列を指定することもできます*。 $section は、挿入できないようにエスケープする必要があります。

あなたのテーブル スキーマはわかりませんが、このようなリレーションがある場合、これらのテーブルに外部キーが必要であり、クエリは高速で、必要なのは 1 つだけです! これは、リレーションが DB に保存されているため、データ モデルに対してクエリを実行する方法です。

于 2013-04-20T20:10:59.340 に答える
0

パイプ記号の例に特殊文字を使用 | そしてこれを行います:

   $str="|".$cat1."|".$cat2."|".$cat3+"|";

Like 条件を使用します。

SELECT * FROM テスト WHERE $str like '%|'+cast(category as varchar) +'|%' orRDER BY id ASC

于 2013-04-20T20:24:16.487 に答える