Столбец GROUP BY HAVING COUNT (*)> 1, и все еще показывают все строки? - PullRequest
0 голосов
/ 13 февраля 2019

Я только пытаюсь отобразить строки с одинаковым значением столбца GROUP_CONCAT ().При использовании GROUP BY в конце он просто показывает последнее полное имя в таблице из-за страны GROUP BY.Можно ли показать все строки, когда я группирую по стране?Это мой sql:

SELECT firstname, lastname, country, COUNT(*) c
FROM (
   SELECT firstname, lastname, 
   GROUP_CONCAT(
      DISTINCT f.countryname
      ORDER BY f.countryname ASC
      SEPARATOR ','
   ) AS country
   FROM person p 
   INNER JOIN favoritecountry f 
   ON p.id = f.id 
   GROUP BY firstname, lastname 
) t 
GROUP BY country 
HAVING c > 1
ORDER BY c DESC;

Мой результат:

+-----------+----------+--------------+---+
| firstname | lastname |   country    | c |
+-----------+----------+--------------+---+
| bill      | smith    | Poland,Spain | 2 |
+-----------+----------+--------------+---+

Вместо этого я хочу что-то вроде этого:

+-----------+----------+--------------+---+
| firstname | lastname |   country    | c |
+-----------+----------+--------------+---+
| bill      | smith    | Poland,Spain | 2 |
| phil      | cooper   | Poland,Spain | 2 |
+-----------+----------+--------------+---+

Новое в SQL, поэтому нужнонекоторая помощь

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Начиная с MySQL 8, вы можете использовать оконные функции (например, COUNT OVER) для таких задач:

SELECT firstname, lastname, countries, cnt
FROM
(
  SELECT firstname, lastname, countries, COUNT(*) over (PARTITION BY countries) AS cnt
  FROM
  (
     SELECT
       p.firstname, p.lastname, 
       GROUP_CONCAT(DISTINCT f.countryname
                    ORDER BY f.countryname ASC
                    SEPARATOR ',') AS countries
     FROM person p 
     INNER JOIN favoritecountry f ON p.id = f.id 
     GROUP BY p.firstname, p.lastname 
  ) grouped
) counted
WHERE cnt > 1
ORDER BY cnt DESC, countries;
0 голосов
/ 13 февраля 2019

Исходя из ожидаемого результата, вы должны объединить счетчик для группы group_concat с названием страны

    select  t2.firstname, t2.lastname, t2.country
    from   (
        SELECT firstname, lastname, 
        GROUP_CONCAT(
          DISTINCT f.countryname
          ORDER BY f.countryname ASC
          SEPARATOR ','
       ) AS country
       FROM person p 
       INNER JOIN favoritecountry f 
       ON p.id = f.id 
       GROUP BY firstname, lastname 
    ) t2
    cross join  (
        select t1.country, count(*) my_count
        from (
            SELECT firstname
             , lastname, 
            GROUP_CONCAT( DISTINCT f.countryname
                ORDER BY f.countryname ASC
                SEPARATOR ','
                ) AS country
            FROM person p 
            INNER JOIN favoritecountry f ON p.id = f.id 
            GROUP BY firstname, lastname 
        )   t 

    ) t1 on t1.country = t2.country
...