Могу ли я считать несколько столбцов с помощью группы By? - PullRequest
1 голос
/ 17 июня 2019

У меня есть таблица с этими столбцами:

s, s2, s3  
1, 2,  3  
4  
1, 3  
4, 2,  
2, 1  
3, 4  
4  

Я хочу знать, сколько раз уникальные значения в столбце s появляются в столбцах s, s2 и s3.

Пока у меня есть:

$query = "SELECT s, COUNT(*) as count FROM table GROUP BY s";

Это даст мне:

1 - count 2  
2 - count 1  
3 - count 1  
4 - count 3  

Но я хочу посчитать столбцы s2 и s3 так, чтобы результат был:

1 - count 3  
2 - count 3  
3 - count 3  
4 - count 4

Есть идеи, как мне отредактировать запрос, чтобы я мог посчитать столбцы s, s2 и s3 group по значениям столбца s?

С уважением,

Арье

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Вам нужен UNION ALL для всех столбцов, а затем подсчитайте их:

select
  t.s, count(*) counter
from (
  select s from tablename union all
  select s2 from tablename union all
  select s3 from tablename
) t
where t.s is not null
group by t.s

См. Демоверсию .
Результаты:

| s   | counter |
| --- | ------- |
| 1   | 3       |
| 2   | 3       |
| 3   | 3       |
| 4   | 4       |

Если в столбцах s2 и s3 есть значения, которых нет в столбце s, и вы хотите, чтобы они были исключены, то вместо:

where t.s is not null

использование

where t.s in (select s from tablename)
0 голосов
/ 17 июня 2019

@ forpas ответ хороший.Тем не менее, две вещи, которые вы должны учитывать.

  1. Из-за использования union запрос будет медленнее с увеличением размера данных.
  2. Если ввод выглядит следующим образом:
s, s2, s3  
1, 2,  3  
4  
1, 3  
4, 2,  
2, 1  
3, 4  
4     5

Результат предоставленного запроса будет:

| s   | counter |
| --- | ------- |
| 1   | 3       |
| 2   | 3       |
| 3   | 3       |
| 4   | 4       |
| 5   | 1       |

, тогда как он должен остаться таким же, как 5, и отсутствует в столбце s.

Для разрешения обоих изПри рассмотрении вышеизложенных вопросов я предлагаю использовать JOIN вместо UNION:

SELECT t3.s, IF(t3.s = t4.s3, cnt1 + 2, cnt1 + 1) as counter FROM 
    (SELECT *, count(*) AS cnt1 FROM 
        (SELECT s from table) AS t1 
        LEFT JOIN 
        (SELECT s2 FROM table) AS t2 
        ON t1.s = t2.s2 GROUP BY t1.s
    ) AS t3 
    LEFT JOIN 
    (SELECT s3 FROM table) AS t4 
    ON t3.s = t4.s3 
ORDER BY t3.s

Запрос может показаться немного длинным и сложным, но он действительно прост, если взглянуть на логику.

Шаг 1
Что я сделал здесь, так это сделал левое соединение от столбца s к s2 и посчитал для этого результаты, так что это даст вам на 1 меньшее число, чем общее количество чисел, присутствующих в нем.создаст связь слева направо.

Шаг 2
Затем я сделал левое соединение от s до s3 и увеличу количество шагов 1 на 1, только если отношениенайдено.

Шаг 3
В конечном итоге у меня есть увеличениеуменьшил число на 1, чтобы мы могли преобразовать число отношений в число сущностей.

Надеюсь, это имеет смысл

...