Как получить данные, которые не в том же порядке, что и запрос в SQL? - PullRequest
0 голосов
/ 30 ноября 2010

Я пытаюсь получить запись из таблицы в SQL.

Вот что я хочу. Например:

У меня есть имя таблицы studentScore с двумя столбцами:

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

Я хочу сделать это: когда я набираю счет в поле поиска, я хочу, чтобы он показывал мне имя ученика. Например: я мог набрать «83, 96, 75» (оценки могут быть в любом порядке), и это должно показать мне имя студента «Джон Смит». Но мне интересно, как мы можем указать в предложении WHERE, чтобы он выбирал правильную запись, если то, что мы вводим в поле, не в том же порядке, что и исходные данные в столбце?

Ответы [ 8 ]

2 голосов
/ 30 ноября 2010

Ваша проблема в том, что ваши данные не нормализованы должным образом. Вы помещаете отношение 1 к n в одну таблицу. Если бы вы реорганизовали свои таблицы следующим образом:

Table Students

id  name
1   John Smith

Table Scores

studentId score
1         75
1         83
1         96

Вы можете сделать запрос как:

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

Это также помогает, если вы хотите выполнить другие запросы, например, выяснить, у каких учеников оценка по крайней мере X, что было бы иначе невозможно с вашим существующим макетом стола.

Если вам нужно придерживаться существующего макета, который я не рекомендую, однако вы можете разделить ввод пользователя и затем выполнить запрос, подобный

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

Но я бы на самом деле воздержался от этого.

0 голосов
/ 30 ноября 2010

Так что да, я согласен со всеми, что этот дизайн - дерьмо.Если бы вы должным образом нормализовали эту таблицу, вы бы очень легко могли получить нужные вам данные.

Однако , вот как вы могли бы сделать это стекущая структура.Разделить пользовательский ввод на дискретные оценки.Затем передайте каждое значение в процедуру.

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 
0 голосов
/ 30 ноября 2010

Нет таблицы sql должны иметь несколько значений для атрибута (в одном столбце). Баллы хранятся в виде строки? Если это так, ваш запрос будет более сложным, и вы теряете точку БД.

однако, на ваш вопрос:

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

это вернет столбцы 4, 3 и 2 в этом порядке (4,3,2), даже если они сохранены в порядке 1, 2, 3, 4. SQL возвращает то, что вы запрашиваете, в порядке спроси их.

0 голосов
/ 30 ноября 2010

Улучшение вашей схемы базы данных ... это не удовлетворяет даже первой нормальной форме (http://en.wikipedia.org/wiki/Database_normalization#Normal_forms).

Улучшение схемы избавит вас от многих головных болей в будущем (возникающих в результате аномалий обновления).

0 голосов
/ 30 ноября 2010

Если вы не хотите создавать новую таблицу для результатов, например, с помощью столбцов StudentId, Score, вы можете отсортировать числа перед их сохранением.

Таким образом, когда кто-то печатает запрос, выотсортируйте эти числа и сравните их с сохраненными строками.

Если вам нужна исходная позиция партитур, вы можете сохранить их в отдельном поле.

0 голосов
/ 30 ноября 2010

Это пример, где нормализация базы данных должна вам сильно помочь.

Вы можете хранить ваши данные, как это ( Редактировать: , если вы хотите сохранить заказ, вы можете добавить столбец заказа)

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

Но если вы застряли с текущей моделью, ваш следующий лучший вариант - отсортировать столбец Scores, тогда вам просто нужно взять строку поиска из текстового поля, отсортировать и отформатировать ее правильно, тогда вы можете искать. *

Наконец, если результаты не отсортированы в таблице, вы можете создать все возможные комбинации

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

и найдите их всех с помощью OR.

0 голосов
/ 30 ноября 2010

Полагаю, это разрешимо, но было бы проще, если бы баллы для каждого учащегося хранились в виде отдельных строк, например, в таблице scores.В противном случае код должен был бы переставлять вход в каждый мыслимый порядок.Или запись результатов должна быть как-то в стандартном порядке.

0 голосов
/ 30 ноября 2010

Вы можете использовать регулярные выражения или оператор Like

Решение регулярного выражения может выглядеть как

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

Это самый простой способ но я рекомендую вам изменить всю структуру таблицы, как уже упоминалось пару раз, так как у вас нет возможности воспользоваться индексом или ключом который исчерпает компьютер за пару десятков посетителей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...