MySQL View Проблемы - PullRequest
       10

MySQL View Проблемы

0 голосов
/ 24 ноября 2011

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

users
-----
ID   FIRST_NAME   LAST_NAME
1    Joe          Bloggs  
2    Fred         Sexy
3    Jo           Fine
4    Yo           Dude
5    Hi           There

answers
-------
ID   CREATED_AT   RESPONSE   USER_ID
1    2011-01-01   3          1
2    2011-01-01   4          2
3    2011-01-02   5          5

Моя цель - создать представление, которое будет выводить следующее:

USER_ID   CREATED_AT   RESPONSE
1         2011-01-01   3
2         2011-01-01   4
3         2011-01-01   NULL
4         2011-01-01   NULL
5         2011-01-01   NULL
1         2011-01-02   NULL
2         2011-01-02   NULL
3         2011-01-02   NULL
4         2011-01-02   NULL
5         2011-01-02   5

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

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 24 ноября 2011

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

select u.id user_id,
       a.created_at,
       max(case when a.user_id = u.id then response end) response
from users u
cross join answers a
group by u.id, a.created_at
0 голосов
/ 24 ноября 2011

Это делает трюк, но вместо того, чтобы возвращать NULL для пропущенных ответов, он возвращает 0.

  select 
    distinct u.id, a.created_at, MAX(IF(u.id=a.user_id, a.response, 0)) response
  from users u, answers a
    group by id, created_at
    order by created_at, u.id
0 голосов
/ 24 ноября 2011

попробуйте это

select t3.user_id, t3.created_at, a.response
from 
(select t2.user_id as user_id, t1.created_at as created_at, null
from
(select distinct created_at
from answers) t1, users t2) t3 answers a
where t3.user_id = a.user_id and t3.created_at = a.created_at

для нулей, я думаю, что левое внешнее объединение будет работать

select t3.user_id, t3.created_at, a.response
from 
(select t2.user_id as user_id, t1.created_at as created_at, null
from
(select distinct created_at
from answers) t1, users t2) t3 LEFT OUTER JOIN answers a
ON t3.user_id = a.user_id and t3.created_at = a.created_at
0 голосов
/ 24 ноября 2011
select users.id as user_id, created_at, response from users
  left outer join answers on users.id = answers.user_id
  order by created_at, users.id
...