У меня есть headhache, пытаясь заставить этот простой запрос работать в SQL на очень большой базе данных, возможно, некоторые из вас могут помочь?
ID|R1 |R2
1 | a | b
1 | c | d
2 | a | b
2 | c | d
Я хотел бы сделать запрос выбора sql, чтобы получить вместо этого:
ID|R1 |R2 |R3 |R4
1 | a | b | c | d
2 | a | b | c | d
Спасибо за любую помощь !
Я собираюсь предложить запрос, который будет иметь почти такое же поведение, что и вы, и это будет довольно просто:
SELECT
ID, GROUP_CONCAT(val ORDER BY val) val
FROM
(
SELECT ID, R1 AS val FROM yourTable
UNION ALL
SELECT ID, R2 FROM yourTable
) t
GROUP BY ID;
Этот подход желательно по нескольким причинам. Во-первых, он является надежным в отношении любого произвольного количества "столбцов", которые может иметь данный ID
. Во-вторых, он дает нам возможность упорядочивать каждую строку значений любым способом. Наконец, это будет намного легче поддерживать, чем точный ответ с использованием переменных сеанса, чтобы имитировать такие вещи, как номер строки.
SET SESSION group_concat_max_len = @@max_allowed_packet;
также
Это сложно, потому что в вашем столе недостаточно идентификаторов. Один из методов - использовать переменные, добавить порядковый номер и совокупность:
select id,
max(case when rn = 1 then r1 end) as r1,
max(case when rn = 1 then r2 end) as r2,
max(case when rn = 2 then r1 end) as r3,
max(case when rn = 2 then r2 end) as r4
from (select t.*,
(@rn := if(@i = id, @rn + 1,
if(@i := id, 1, 1)
)
) as rn
from (select t.*
from t
order by t.id
) t cross join
(select @rn := 0, @i := -1) params
) t
group by id;
Этот ответ немного обновляется до ответа @TimBiegeleisen.
если таблица большая, вам также необходимо использовать
SET SESSION group_concat_max_len = @@max_allowed_packet;
Этот запрос преобразует разделенные запятыми значения из функции GROUP_CONCAT
в столбцы, используя вложенные функции SUBSTRING_INDEX
.
запрос
SELECT
ID
, SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 1), ',', -1) AS r1
, SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 2), ',', -1) AS r2
, SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 3), ',', -1) AS r3
, SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 4), ',', -1) AS r4
FROM (
SELECT
ID, GROUP_CONCAT(val ORDER BY val) val
FROM
(
SELECT ID, R1 AS val FROM yourTable
UNION ALL
SELECT ID, R2 FROM yourTable
) t
GROUP BY ID
) x
см. демо http://rextester.com/SDF72100
id
всегда будет ровно две строки? Имеет ли значение, какие значения строкr3
вr3
иr4
?