2010-11-30 14 views
0

Я пытаюсь получить запись из таблицы в SQL.Как получить данные, которые находятся не в том же порядке, что и запрос в SQL?

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

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

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

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

+0

Вы можете изменить базу данных, чтобы хранить оценки по отдельности? – 2010-11-30 20:46:40

+0

Да, я мог бы. Я просто пытался изучить возможность положить все в один стол. Спасибо, – 2010-11-30 22:09:45

+0

Вы нашли решение? Отметить ответ? – Brad 2010-12-01 21:04:48

ответ

0

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

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

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

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

+0

@Breezer, просто ** как ** вы бы использовали предложение `LIKE` в этом случае? – Brad 2010-11-30 20:48:43

+0

@Brad, ну есть пример, если вы просмотрите ответы – Breezer 2010-11-30 20:57:58

0

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

0

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

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

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.

0

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

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

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

0

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

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

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

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

2

Ваша проблема в том, что ваши данные неправильно нормализованы. Вы помещаете отношения 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

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

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

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 
Смежные вопросы