SQL 查询以检索大于 1 的行值和对应的列名
SQL Query to retrieve Row Values greater than 1 and Corresponding Column Names
我有这个 MYSQL (phpmydamin) 数据库 table,它看起来像这样,我正在尝试检索有关特定行和列的大于 1 的值的信息与这些设定值相对应的名称。我基本上是想找出学生持有的物品以及数量。
username item1 item2 item3 item4 item5 item6 item7
n000111 1 0 1 1 1 1 1
n010554 0 0 3 2 0 0 0
n010555 1 0 4 0 0 1 1
n010556 0 0 0 0 0 0 0
n010557 0 8 0 2 0 1 0
例如,如果我将用户名 "n010555" 发送到我的 phpscript 以从此 table 获取数据,我期待这样的反馈:
n010555
item1 - 1
item3 - 4
item6 - 1
item7 - 1
total - 7
诸如此类,非常感谢您的帮助。提前致谢。
您需要做的是对数据进行逆透视。不幸的是,您的数据存储在 MySQL 中,它没有这样的功能。
这可以使用交叉联接来完成,但效率不是特别高。如果您没有大量数据,这可能不是问题,但如果您有大量数据,您可能需要考虑对数据进行 ETL 处理或更改存储设计。
Bluefeet has a good answer 了解如何完成此操作。您的解决方案的改编看起来像:
select t.id,
c.col,
case c.col
when 'item1' then item1
when 'item2' then item2
when 'item3' then item3
when 'item4' then item4
when 'item5' then item5
when 'item6' then item6
when 'item7' then item7
end as data
from yourtable t
cross join
(
select 'item1' as col
union all select 'item2'
union all select 'item3'
union all select 'item4'
union all select 'item5'
union all select 'item6'
union all select 'item7'
) c
where
username = :username
我有这个 MYSQL (phpmydamin) 数据库 table,它看起来像这样,我正在尝试检索有关特定行和列的大于 1 的值的信息与这些设定值相对应的名称。我基本上是想找出学生持有的物品以及数量。
username item1 item2 item3 item4 item5 item6 item7
n000111 1 0 1 1 1 1 1
n010554 0 0 3 2 0 0 0
n010555 1 0 4 0 0 1 1
n010556 0 0 0 0 0 0 0
n010557 0 8 0 2 0 1 0
例如,如果我将用户名 "n010555" 发送到我的 phpscript 以从此 table 获取数据,我期待这样的反馈:
n010555
item1 - 1
item3 - 4
item6 - 1
item7 - 1
total - 7
诸如此类,非常感谢您的帮助。提前致谢。
您需要做的是对数据进行逆透视。不幸的是,您的数据存储在 MySQL 中,它没有这样的功能。
这可以使用交叉联接来完成,但效率不是特别高。如果您没有大量数据,这可能不是问题,但如果您有大量数据,您可能需要考虑对数据进行 ETL 处理或更改存储设计。
Bluefeet has a good answer 了解如何完成此操作。您的解决方案的改编看起来像:
select t.id,
c.col,
case c.col
when 'item1' then item1
when 'item2' then item2
when 'item3' then item3
when 'item4' then item4
when 'item5' then item5
when 'item6' then item6
when 'item7' then item7
end as data
from yourtable t
cross join
(
select 'item1' as col
union all select 'item2'
union all select 'item3'
union all select 'item4'
union all select 'item5'
union all select 'item6'
union all select 'item7'
) c
where
username = :username