есть задача, нет правильной идеи для реализации

_Leonchik_

Новичок
есть задача, нет правильной идеи для реализации

С наступившем Новым Годом!

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

Для юзеров имеется так сказать учебный план, т.е. он не может пройти 2-ой тест, если он не прошел первый.
Это реализованно спец. полем (Сортировка уроков) в таблице уроков.
Пример:
математика 1 семестр. (Сорт - 1)
математика 2 семестр. (Сорт - 2)
математика 3 семестр. (Сорт - 3)

задача состоит в том:
1. чтобы не дать пройти юзеру тест, кот. он не имеет права (он не прошел предыдущий)
2. не дать повторно пройти тест.

Про клике на сылку(кнопку) для прохождения теста. надо учесть все моменты:
Делаю следующим образом:
1. выгребаю все тесты из базы(согласно сортировки или уч. плана) в массив
2. выбираю тесты, кот. юзер прошел. в массив

В 1 цикле проходим по всем имеющимся тестам. Во 2-ом вложенном цикле по прошедшим юзером тестам. и сравниваем.

Но получается, что мы бегаем по массиву юзера столько раз, сколько у нас уроков.
И наверняка. когда их будет много - скажется на производительности!
Что посоветуете?
загвоздка в учеб. плане - это очевидно.
как по др. его можно реализовать?

-~{}~ 03.01.07 18:19:

Есть вариант еще:
проходя по всем урокам заглядывать в табл. прошедших тестов. и смотреть ,данный тест уже проходили? нет? берите! проходили - болт вам.
также созгласно сортировки.
 

hermit_refined

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

в данном случае - если вам нужно, поясните задачу.
Про клике на сылку(кнопку) для прохождения теста.
что это значит - вы хотите проверить, имеет ли право юзер на конкретный тест, или найти все тесты, которые он может пройти? схема бд к ответу должна прилагаться.
 

Фанат

oncle terrible
Команда форума
да ладно, можно и без схемы.
есть же ключевое понятие - тесты имеют параметр для сортировки! то есть, зачем выгребать все, когда можно просто сравнить прямо в запросе - это вопрос автору топика - непонятно.
То есть, по первому пункту сравнение на больше-меньше

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

_Leonchik_

Новичок
спасибо за моральную поддержку.
hermit_refined
что это значит - вы хотите проверить, имеет ли право юзер на конкретный тест, или найти все тесты, которые он может пройти?
Именно, проверить только на право прохождения.

Фанат
есть такая запись, с ид юзера и теста, или нет?
Все есть!
Незнаю как привести тут схему БД, что бы было понятно читающим ;(
 

Фанат

oncle terrible
Команда форума
ну так проверяй. эту запись. одним запросом.
если запрос вернул одну строку - юзер проходил тест и ему больше нельзя.
если не вернул ни одной строки - значит можно.
что сложного-то?
 

hermit_refined

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

programmer_2006

Новичок
Автор оригинала: _Leonchik_
спасибо за советы.
Послушайся Фаната, его совет дельный,все делается одним маленьким запросом либо с группировкой таблиц либо с подзапросом.
Походу у тебя проблема именно с SQL подучи его хорошенько, и сможешь многие вещи с которыми раньше заморачивался делать проще и быстрее.Успехов в Новом Году :)
 
Сверху