группировать по одному столбцу в mysql

#php #mysql

#php #mysql

Вопрос:

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

     A    B    C
   Cat   10   False
   Dog   25   True
   Dog   20   False
   Cat   5    False
 

когда я использую group by для столбца, и результат будет:

     A    B    C
   Cat   5    False
   Dog   20   False
 

Возможно ли сделать такой результат в MySQL:

     A    B    C
   Cat   10   False
         5    False
   Dog   25   True
         20   False
 

или кто-нибудь предполагает, что таблица возвращает мне массив, подобный:

 Array(
       [Cat]=>Array(
                     [0]=> Array(
                                   [0]=>10
                                   [1]=>False
                                ) 
                     [1]=> Array(
                                   [0]=>5
                                   [1]=>False
                                )
                   )
       [Dog]=>Array(
                     [0]=> Array(
                                   [0]=>25
                                   [1]=>True
                                ) 
                     [1]=> Array(
                                   [0]=>20
                                   [1]=>False
                                )
                   )
     )
 

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

1. Просто упорядочивайте по столбцу A, если хотите получить все результаты.

2. ORDER BY A ? Он делает именно то, что вы описали, но A значения повторяются

3. Вы буквально просите, чтобы значение A выводилось только один раз (с пустыми строками в последующих строках)? Это скорее проблема форматирования, с которой лучше справиться в PHP. В противном случае, да, просто упорядочивайте по A.

4. Я могу вас сгруппировать, но я не хочу, чтобы значение столбца A повторялось, или какие-либо идеи для обработки этого в php

Ответ №1:

Если значение столбца следующей строки совпадает со значением столбца предыдущей строки, вам нужно запомнить предыдущее значение строки, чтобы оно не отображалось снова в следующей строке.

Пример:

 select 
    case when @prev != ( @curr := A ) then ( @prev := @curr ) else '' end as A
  , B, C
from( 
    select * from tbl_soq24465988 
    order by 1 asc, 2 desc
) sorted_table
, ( select @prev := '', @curr := '' ) initializer
;
 

Вывод:

  ------ ------ ------- 
| A    | B    | C     |
 ------ ------ ------- 
| Cat  |   10 | False |
|      |    5 | False |
| Dog  |   25 | True  |
|      |   20 | False |
 ------ ------ ------- 
 

Демо @ MySQL 5.5.32 Скрипка