LINUX.ORG.RU

Не соображу, как SQL запрос составить

 


1

2

Доброго времени суток, ЛОР. Нужна помощь коллективного разума в составлении sql-запроса, так как сам в этом не силён.

Дано две таблицы (в упрощенном виде):

Users:
--------------------------------------------------
| Login |      Email      | A half-dozen columns |
--------------------------------------------------
| vasya | vasya@vasya.com | Some other data      |
--------------------------------------------------

TestResults:
----------------------------------------------------------
|    TestName    | Login | Points | A half-dozen columns |
----------------------------------------------------------
| Some cool test | vasya |   146  | Some other data      |
----------------------------------------------------------

Результатом выполнения запроса должна быть таблица следующего вида:

-------------------------------------------------------------------------
| Login | TestName1 Points | TestName2 Points | TestName3 Points | etc. |
-------------------------------------------------------------------------
| vasya |        92        |        87        |         56       | etc. |
-------------------------------------------------------------------------

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

★★★★★

Результатом выполнения запроса должна быть таблица следующего вида:

Какой дурацкий вид результата. Зачем так делать?

p.s. Наверное можно извратиться и примерно такой вывод получить, но я не могу представить разумное объяснение такому представлению данных.

pi11 ★★★★★
()
Последнее исправление: pi11 (всего исправлений: 1)

Вобще не проверял:

SELECT  u.Login, t1.Points AS TestName1_Points, t2.Points AS TestName2_Points, t3.Points AS TestName3_Points 
FROM Users u
LEFT JOIN TestResults t1 ON u.Login = t1.Login AND t1.TestName = 'TestName1'
LEFT JOIN TestResults t2 ON u.Login = t2.Login AND t2.TestName = 'TestName2'
LEFT JOIN TestResults t3 ON u.Login = t3.Login AND t3.TestName = 'TestName3';

mky ★★★★★
()
Ответ на: комментарий от pi11

запрос делается обычно по двум-трем из них.

Хотя это ТС должен уточнить, что именно ему надо, может он хочет такой запрос, чтобы тот сам определил сколько различных тестов есть в TestResults...

mky ★★★★★
()

С произвольным количеством столбцов вряд ли получится. Я бы выгружал два столбца - логин и json с результатами.

anonymous
()

Задача учебная или реальная?

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

Если реальная - то тут либо динамическое формирование запроса, либо наоборот, сливаем общим запросом все данные по Васе (несколько десятков записей - это фигня на самом деле), а выходную таблицу делаем уже программной логикой по результатам запроса. Можно объединить оба подхода.

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

hobbit ★★★★★
()

СУБД какая? На mysql можно сделать group_concat, но он объединяет записи в одно поле.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от mky

Спасибо, взял за основу ваш запрос, немного переделал, всё работает.

hippi90 ★★★★★
() автор топика
Ответ на: комментарий от pi11

Где ты прочитал что тестов 3? На сколько я понял там неизвестное количество тестов.

Выборка может быть по различному числу тестов, но это число известно на этапе написания запроса, т.е. нет необходимости в динамическом формировании.

hippi90 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.