ФорумПрограммированиеPHP для идиотов → Выборка пользователя + уровень

Выборка пользователя + уровень

  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 15:40

    Возник такой вопрос

    имею 2-ве таблицы:

    users:
    id score
    1 4
    2 6
    3 11
    4 21


    levels:
    lvl value
    1 0
    2 5
    3 10
    4 20


    Как рациональнее получить 1 массив вида (LEFT JOIN не пойму как реально применить для диапазона)
    (в SQL особо не силён)
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 31 октября 2010 г. 16:01, спустя 21 минуту 17 секунд

    что ты хочешь в итоге получить?
    не всё полезно, что в swap полезло
  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 16:18, спустя 16 минут 32 секунды

    id score lvl
    1 4 1
    2 6 2
    3 11 3
    4 21 4
    5 3 1
    6 12 3
    n
    Спустя 44 сек.
    score является значением одного из интервалов / диапазонов lvl-ов
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 31 октября 2010 г. 16:42, спустя 24 минуты 1 секунду

    нихуясе задачка
    не всё полезно, что в swap полезло
  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 21:11, спустя 4 часа 28 минут 39 секунд

    Ну да, я что-то могу одуплить как задать условие на попадание числа в диапазон :D
    Спустя 15 сек.
    не могу точнее )))
  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 21:45, спустя 34 минуты 35 секунд

    Профи обосрались? ))))
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 31 октября 2010 г. 21:54, спустя 8 минут 25 секунд

    Как-то ты не удобно хранишь уровни, лучше храни удобней. Да запросы, проще будут
  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 21:58, спустя 4 минуты 13 секунд

    Неудобно в почтовый ящик срать )))
    Есть пользователи у которых есть кол-во баллов
    Есть таблица опыта этих балов, и в соответствием с кол-вом баллов показывает пользовательский уровень.
    Как ещё млин по-другому ты будешь хранить? Это помоему самое простое.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 31 октября 2010 г. 22:09, спустя 11 минут 14 секунд

    1v1 minValue maxValue

    Это как пример, ты всегда идешь на компромисс между логикой и данными.

    В твоем случае либо избыточные данные (уровней не так уж много) и простой запрос, либо запрос уже более интересный.

    Например, конкретно для твоего случая:

    SELECT DISTINCT u.id as id, u.score as score, l.1v1 as 1v1
    FROM
    users u INNER JOIN levels l
    WHERE
    u.score >= l.value AND
    u.score <= (IF(l.value = 0, 5, l.value) * 2)
    GROUP BY u.id, u.score


    Но этому, потому, что я увидел зависимость, а если не будет, то надо примерно, два джойна
  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 22:13, спустя 4 минуты 26 секунд

    Пример просто данных простой, так зависимости увеличения опыта в 2 раза на самом деле нет.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 31 октября 2010 г. 22:19, спустя 5 минут 22 секунды

    на

    SELECT u.id as id, u.score as score, l1.1v1 as 1v1
    FROM
    users u INNER JOIN levels l1
    WHERE
    u.score >= l1.value AND u.score <= (SELECT l2.value FROM levels l2 WHERE l1.value < l2.value ORDER BY l2.value LIMIT 1)
    GROUP BY u.id, u.score


    только еще юнион добавь
  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 22:21, спустя 2 минуты 39 секунд

    Спасиб посмотрю, но что-то пиздецом попахивает ))) и похоже придётся переделывать структуру если ничего лучше не найду ))
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 31 октября 2010 г. 22:26, спустя 4 минуты 23 секунды

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

    Теперь работает точно, как часы:

    SELECT u.id as id, u.score as score, l1.1v1 as 1v1
    FROM
    users u INNER JOIN levels l1
    WHERE
    u.score >= l1.value AND u.score <= IFNULL((SELECT l2.value FROM levels l2 WHERE l1.value < l2.value ORDER BY l2.value LIMIT 1), l1.value + 10)
    GROUP BY u.id, u.score


    и не надо юниовнов
    Спустя 76 сек.

    Профи обосрались? ))))


    и не хуя профи не обосрались, они спят, а вместо них хуярят замы
  • pissflaps

    Сообщения: 148 Репутация: N Группа: Кто попало

    Spritz 31 октября 2010 г. 22:27, спустя 1 минуту 8 секунд

    Спасиб тебе большое
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 31 октября 2010 г. 22:28, спустя 1 минуту 13 секунд

    норм.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!