2013-04-15 2 views
0

У меня есть некоторые данные бронирования из пары представлений в MySQL. Они отлично соответствуют колонкам, и основное отличие - это код бронирования, который помещается в одну из этих строк.Запрос MySQL Union (или аналогичный)

Контекст следующий: это для расчета чисел для спортивного лагеря. Люди забронированы, но могут делать дополнительные занятия.

View 1: Все специализированные заказы (скажем: футбольный класс).

Просмотреть 2: Общая группа.

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

Чтобы быть ясным - вид 1 фактически содержит некоторых (но не исключительно всех) людей изнутри. 2. Существует пересечение двух групп. Очевидно, люди не могут быть в двух группах одновременно (есть только один из них!).

Нахождение всех людей, находящихся в поле зрения 2, конечно, легко ... как View 1. НО, я должен подготовить доклад, который в основном:

  • «Вид 1» перезапись «View 2 »... или поставить еще один способ:
  • „Вид 1“[рода] UNION„Вид 2“

Однако: Я не уверен, что лучший способ сделать это, поскольку есть дополнительные сложности:

Каждая строка имеет вид ap проксимальном (с другими вещами опущены) следующим образом:

User ID Timeslot Activity 
1   A  Football 
1   A  General 
2   A  General 
3   A  Football 

Как вы можете видеть, эти строки все касается временного интервала A: - Пользователь 2 делает общую деятельность. - Пользователь 3 делает футбол. - Пользователь 1 делает футбол и вообще.

AS эти элементы не уникальны, вышесказанное является UNION (отличным), так как нет действительно разных строк.

Выход мне нужно следующим образом:

User ID Timeslot Activity 
1   A  Football 
2   A  General 
3   A  Football 

Здесь, футбол взял «приоритет» над «вообще», и, таким образом, я получаю картину, где люди в любое время.

Этот UNION имеет отдельное предложение по ряду полей, но игнорирует другие.

Итак: Кто-нибудь знает, как сделать то, что составляет:

  • «добавить две таблицы вместе и перезаписать одну из них, если это тот же временной интервал»

Или что-то вроде:

  • "селективный отчет о СОЕДИНЕНИИ ДИСЦИПЛИНА".

Приветствия Rick

ответ

0

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

SELECT * 
FROM 
    (SELECT *, 
      IF(Activity='General',1,0) AS order_column 
    FROM `Table1` 
    ORDER BY order_column) AS tmp 
GROUP BY UserId 

Это добавит order_column к исходной таблице, в качестве значения 1 если значение активности является general; Сделав это, мы можем выбрать это временное упорядочение таблицы в этом столбце (по возрастанию), а вся запись с общей активностью - после всех остальных. После этого мы можем просто выбрать результат этой временной группировки таблиц по идентификатору пользователя. Первая группа, которая не имеет какой-либо совокупной функции, принимает первую запись.

EDIT: Если вы не использовать группу без агрегатной функции это «некрасиво» альтернатива:

SELECT UserId, 
     Timeslot, 
     SUBSTRING(MAX(CASE Activity WHEN "General" THEN "00General" WHEN "Football" THEN "01Football" ELSE Activity END) , 3) 
FROM `Table1` 
GROUP BY UserId, 
     Timeslot LIMIT 0 , 
         30 

Здесь мы должны определить каждое возможное значение для Activity.

+0

К сожалению, мне запретили использовать «группу по» без агрегатной функции: на самом деле это не намеренное поведение в SQL. См. Мой предыдущий вопрос: http://stackoverflow.com/questions/15966530/mysql-edge-case-use-of-group-by – elb98rm

Смежные вопросы