@ forpas ответ хороший.Тем не менее, две вещи, которые вы должны учитывать.
- Из-за использования
union
запрос будет медленнее с увеличением размера данных. - Если ввод выглядит следующим образом:
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, чтобы мы могли преобразовать число отношений в число сущностей.
Надеюсь, это имеет смысл