需要帮助编写查询(重组 table)
need help writing a query (restructuring the table)
我需要写一个 select 语句,它将按以下方式重写 table...我不确定如何使用 MySQL 来完成此操作。
table
的例子
user_id date a b c
123456 2020-01-01 1 1 1
234567 2020-03-04 1 0 0
453576 2020-05-05 1 0 1
想要的结果
user_id date results
123456 2020-01-01 a
123456 2020-01-01 b
123456 2020-01-01 c
234567 2020-03-04 a
453576 2020-05-05 a
453576 2020-05-05 c
在 MySQL 中,您可以使用 union all
逆透视,同时过滤 1
值:
select user_id, date, 'a' as result from mytable where a = 1
union all select user_id, date, 'b' from mytable where b = 1
union all select user_id, date, 'c' from mytable where c = 1
order by user_id, date, result
如果您有大量数据或者您的“table”确实是一个复杂的查询(例如子查询或视图),那么使用 cross join
进行逆透视通常比使用 union all
:
select t.user_id, t.date, r.result
from t cross join
(select 'a' as result union all
select 'b' as result union all
select 'c' as result
) r
where (t.a = 1 and r.result = 'a') or
(t.b = 1 and r.result = 'b') or
(t.c = 1 and r.result = 'c') ;
对于单个小型 table,性能可能并不重要。
我需要写一个 select 语句,它将按以下方式重写 table...我不确定如何使用 MySQL 来完成此操作。
table
的例子user_id date a b c
123456 2020-01-01 1 1 1
234567 2020-03-04 1 0 0
453576 2020-05-05 1 0 1
想要的结果
user_id date results
123456 2020-01-01 a
123456 2020-01-01 b
123456 2020-01-01 c
234567 2020-03-04 a
453576 2020-05-05 a
453576 2020-05-05 c
在 MySQL 中,您可以使用 union all
逆透视,同时过滤 1
值:
select user_id, date, 'a' as result from mytable where a = 1
union all select user_id, date, 'b' from mytable where b = 1
union all select user_id, date, 'c' from mytable where c = 1
order by user_id, date, result
如果您有大量数据或者您的“table”确实是一个复杂的查询(例如子查询或视图),那么使用 cross join
进行逆透视通常比使用 union all
:
select t.user_id, t.date, r.result
from t cross join
(select 'a' as result union all
select 'b' as result union all
select 'c' as result
) r
where (t.a = 1 and r.result = 'a') or
(t.b = 1 and r.result = 'b') or
(t.c = 1 and r.result = 'c') ;
对于单个小型 table,性能可能并不重要。