Как получить количество сгруппированных по строкам - SQL - PullRequest
0 голосов
/ 23 мая 2018

Итак, у меня есть эта таблица

table: "tbl_hash"

 ------------------------------
| id | hash1 | hash2 | hash3 |
------------------------------
| 1  |   a   |   b   |   c   |
| 2  |   a   |   b   |   c   |
| 3  |   a   |   g   |   d   |
| 4  |   a   |   g   |   d   |
| 5  |   a   |   g   |   d   |
------------------------------

Я хочу сгруппировать их только по hash1, hash2 и hash3.посчитайте их и верните только число, которое больше на 2.

Так что у меня есть этот запрос, чтобы получить нужные значения:

select CONCAT(hash1, hash2, hash3) as hashes, COUNT(*) as count from `tbl_hash` group by hashes having `count` > 2 limit 5

^^, приведенный выше запрос работает отлично ..

Но что, если я хочу получить данные и посчитать для каждой строки?Ожидаемый результат:

--------------------------------------
| id | hash1 | hash2 | hash3 | count | 
--------------------------------------
| 1  |   a   |   b   |   c   |   2   |
| 2  |   a   |   b   |   c   |   2   |
| 3  |   a   |   g   |   d   |   3   |
| 4  |   a   |   g   |   d   |   3   |
| 5  |   a   |   g   |   d   |   3   |
--------------------------------------

Я также планирую преобразовать их в построитель запросов, используя DB::table...

1 Ответ

0 голосов
/ 23 мая 2018

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

SELECT t1.*, t2.cnt
FROM tbl_hash t1
INNER JOIN
(
    SELECT hash1, hash2, hash3, COUNT(*) AS cnt
    FROM tbl_hash
    GROUP BY hash1, hash2, hash3
    HAVING COUNT(*) > 2
) t2
     ON t1.hash1 = t2.hash1 AND
        t1.hash2 = t2.hash2 AND
        t1.hash3 = t2.hash3;

Обратите внимание, что то, что я написал выше, полностью отфильтровывает любые оригинальные записи, принадлежащие хэшу 1 / хэшу 2 / хэшу 3группа, у которой не было числа больше 2. Если вместо этого вы хотите, чтобы все записи, с количеством, затем удалили предложение HAVING.

В качестве примечания, в базах данных, которые поддерживают аналитические функции, такие какSQL Server и Oracle, мы могли бы написать гораздо менее подробный запрос, используя COUNT в качестве аналитической функции.В какой-то момент основные версии MySQL также будут поддерживать это.Но сейчас мы застряли на объединении.

...