Отображение нескольких кортежей результатов в один кортеж в разных разных столбцах

#mysql

#mysql

Вопрос:

Исходная схема базы данных—

    id      username     date         Grade     
    ----------------------------------------
    1     Haryana   15/02/2001         A        
    2     Haryana   20/02/2008         B     
    3     Punjab    15/05/2001         A    
    4     Haryana   25/02/2008         A    
    5     Punjab    25/02/2008         B 
 

Требуется вывод с помощью запроса выбора—

  username     date     Grade   username  date     Grade   username     date     Grade
-------------------------------------------------------------------------------------------
    haryana   15/02/2001   A     Haryana 20/02/2008   B      Haryana   25/02/2008    A     
     Punjab    15/05/2001  A     Punjab  25/02/2008   B 
 

Примечание->
В принципе, я хочу, чтобы имя столбца «username» использовалось для объединения нескольких строк пользователя «Haryana» в один кортеж с несколькими строками с несколькими столбцами.

Комментарии:

1. Серьезно подумайте о том, чтобы решить проблемы отображения данных в вашем коде уровня представления / уровня приложения, если такая вещь доступна; как правило, это быстрее и намного (и проще) масштабируемо и гибко. В противном случае см. Сводные запросы.

2. В принципе, у PHP не так много возможностей 🙂

3. Я не понимаю этот комментарий:- $

4. Как я уже сказал, я просто хочу отформатировать данные на основе столбца «имя пользователя». как указано выше

5. И вы используете какой-то ранг и @prev, которые у меня не работали…

Ответ №1:

Программное обеспечение для реляционных баз данных ужасно при создании наборов результатов (таблиц), в которых количество или имена столбцов зависят от данных в других таблицах. Это то, о чем вы просите. Это сложный код для написания и практически невозможный в обслуживании. Даже если вы заставите его работать в SQL, это будет жалкий взлом ™. Человек, который работает над этим после вас, проклянет вас.

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

При этом, возможно, вы можете попробовать GROUP_CONCAT() функцию агрегирования.

Вот возможный запрос.

 SELECT GROUP_CONCAT(CONCAT_WS(' ', username,date, Grade) ORDER BY date SEPARATOR ' | ')
  FROM table
 GROUP BY username
 

Это даст результирующий набор, подобный этому:

 Haryana 15/02/2001 A | Haryana 20/02/2008 B  | Haryana 25/02/2008 A
Punjab 15/05/2001 A | Punjab 25/02/2008 B 
 

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

Комментарии:

1. Сэр, я хочу, чтобы у каждого столбца был свой собственный, как будто вы объединили каждый кортеж в один столбец.. Есть ли что-нибудь, что я могу сделать, чтобы достичь этого?

Ответ №2:

Я всерьез не защищаю это как решение (см. Первое предложение Олли или мой комментарий выше). Итак, просто для удовольствия…

 SELECT username
     , MAX(CASE WHEN rank = 1 THEN date END) date1
     , MAX(CASE WHEN rank = 1 THEN grade END) grade1
     , MAX(CASE WHEN rank = 2 THEN date END) date2
     , MAX(CASE WHEN rank = 2 THEN grade END) grade2 
     , MAX(CASE WHEN rank = 3 THEN date END) date3
     , MAX(CASE WHEN rank = 3 THEN grade END) grade3 
  FROM 
     (
       SELECT x.*
            , CASE WHEN @prev = username THEN @i:=@i 1 ELSE @i:=1 END rank
            , @prev:=username 
         FROM my_table x
            ,(SELECT @prev:=null,@i:=0) vars 
        ORDER 
           BY username
            , date
     ) a
 GROUP 
    BY username;
 

Комментарии:

1. Но я не должен этого делать, в основном я хочу форматировать данные, возвращая их в одну строку для общего значения столбца, вот и все. Это всего лишь примерная таблица….

2. Послушайте, крайне неразумно пытаться делать то, что вы хотите, в SQL. Это жалкий взлом. Вам нужно сделать это на Php, или C #, или Crystal Reports, или в любом другом клиентском пакете, который у вас есть.