0

SQL でテーブルからレコードを取得しようとしています。

これが私が欲しいものです。例えば:

私は2つの列を持つテーブル名studentScoreを持っています:

studentName -----  Scores
John Smith  ----- 75,83, 96

やりたいこと: 検索ボックスにスコアを入力すると、生徒の名前が表示されます。例: 「83, 96, 75」と入力すると (スコアは任意の順序で指定できます)、生徒の名前「John Smith」が表示されます。しかし、ボックスに入力したものが列の元のデータと同じ順序でない場合、正しいレコードを取得するように WHERE 句でどのように指定できるのでしょうか?

4

8 に答える 8

2

Your issue is that your data is not properly normalized. You are putting a 1 to n relationship into a single table. If you'd reorganize your tables like such:

Table Students

id  name
1   John Smith

Table Scores

studentId score
1         75
1         83
1         96

You could do a query like:

select st.name from Students st, Score sc where st.id = sc.studentId and sc.score in ("83", "75", "96")

This also helps if you want to do other queries, like find out which students have a score of at least X, which would be otherwise impossible with your existing table layout.

If you must stick with your existing layout, which I don't recommend, however you could split up the user input and then do a query like

select from studentScore where score like '%75%' or score like '%83%' or score like '%96%'

But i really would refrain from doing so.

于 2010-11-30T20:52:50.417 に答える
0

正規表現または Like 演算子を使用できます

正規表現のソリューションは次のようになります

SIMILAR TO '%(SCORE1|SCORE2|SCORE3)%' 

それが最も簡単な方法ですが、数十人の訪問者の問題でコンピューターを使い果たすインデックスやキーを利用する可能性がないため、ここで数回言及したようにテーブル構造全体を変更することをお勧めします

于 2010-11-30T20:46:39.177 に答える
0

解決可能だと思いますが、各生徒のスコアがテーブルなどに別々の行として保存されていると、より簡単になりscoresます。それ以外の場合、コードはエントリを考えられるすべての順序に並べ替える必要があります。または、スコアのエントリは何らかの方法で標準的な順序にする必要があります。

于 2010-11-30T20:47:05.490 に答える
0

これは、データベースの正規化が大いに役立つ例です。

このようにデータを保存できます(編集:順序を維持したい場合は、順序列を追加できます)

studentName        Scores    Order
John Smith         75        1
John Smith         83        2
John Smith         96        3
Foo bar            73        1
Foo bar            34        2
........

しかし、現在のモデルに行き詰まっている場合、次善の策はスコア列をソートすることです。テキストボックスから検索文字列を取得し、ソートして正しくフォーマットするだけで検索できます。

最後に、スコアがテーブルでソートされていない場合は、可能なすべての組み合わせを作成できます

75, 83, 96
75, 96, 83
83, 75, 96
83, 96, 75
96, 75, 83
96, 83, 75

でそれらをすべて検索しますOR

于 2010-11-30T20:49:48.957 に答える
0

ええ、私はこのデザインががらくたであることに他の皆に同意します. このテーブルを適切に正規化すると、必要なデータを非常に簡単に取得できます。

ただし、これは現在の構造でそれを行う方法です。ユーザー入力を個別のスコアに分割します。次に、各値をプロシージャに渡します。

CREATE PROCEDURE FindStudentByScores
    (
     @score1 AS VARCHAR(3) = NULL
    ,@score2 AS VARCHAR(3) = NULL 
    ,@score3 AS VARCHAR(3) = NULL 
    )
AS 
    BEGIN
        SELECT  *
        FROM    [Students]
        WHERE   ( @score1 IS NULL
                  OR [Scores] LIKE '%' + @score1 + '%' )
                AND ( @score2 IS NULL
                      OR [Scores] LIKE '%' + @score2 + '%' )
                AND ( @score3 IS NULL
                      OR [Scores] LIKE '%' + @score3 + '%' )

    END 
于 2010-11-30T20:53:28.420 に答える
0

Scores の新しいテーブルを作成したくない場合 (たとえば、StudentId、Score 列など)、数値を保存する前に並べ替えることができます。

このようにして、誰かがクエリを入力すると、それらの数値も並べ替えて、保存されている文字列と比較するだけです。

スコアの元の位置が必要な場合は、それらを別のフィールドに保存できます。

于 2010-11-30T20:50:09.723 に答える
0

データベース スキーマを改善してください...これは、最初の正規形 ( http://en.wikipedia.org/wiki/Database_normalization#Normal_forms )でさえ満たしていません。

スキーマを改善すると、将来の頭痛の種が大幅に軽減されます (更新の異常に起因します)。

于 2010-11-30T20:50:56.223 に答える
0

1 つの属性に対して (同じ列に) 複数の値を持つ SQL テーブルはありません。スコアは文字列として保存されますか? その場合、クエリはより複雑になり、DB の要点を無駄にしています。

ただし、あなたの質問に:

SELECT col4, col3, col2 FROM students WHERE col1 = 57; 

これは、列が 1、2、3、4 の順序で保存されている場合でも、列 4、3、および 2 をその順序 (4、3、2) で返します。SQL は、要求した順序で要求したものを返します。 .

于 2010-11-30T20:51:54.217 に答える