我不习惯在SQL表中使用一列作为字段名,而一列作为fieldValue,所以我想知道最好的查询来解决我的问题。
我的表中有一列用于ID,FieldName和FieldValue:
ID FieldName FieldValue
1 FName John
2 LName Smith
3 Email JSmith@gmail.com
4 event_0 Movies
5 event_1 Dinner
6 FName Mike
7 LName Jones
...
我需要向所有参与者展示“电影”并显示所有观看电影的人数。另外,我遇到的另一个问题是,有时填写表单的人只会有event_0,有时他们会有event_0,event_1,event_2。
感谢您的帮助!谢谢!
答案 0 :(得分:0)
您的表看起来就像是我过去必须处理的表,客户端具有一个以列为记录而不是行的表,以自定义表单中的字段(每个字段名称为一列,其值)。
我处理的方式是: -使用CASE WHEN为每行创建一个数据透视表...
我将在几个小时内向您介绍如何使用一些代码
答案 1 :(得分:0)
我希望这可以解决您的第一个查询,在这里您可以检查有多少人正在看电影以及其他活动。
SELECT COUNT(ID), FieldValue
FROM table_name
GROUP BY FieldValue;
答案 2 :(得分:0)
这里值得考虑...一种专门针对8.0之前的MySQL版本的解决方案。
这完全取决于事件发生之前的联系方式。
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(ID SERIAL PRIMARY KEY
,attribute VARCHAR(12) NOT NULL
,value VARCHAR(12) NOT NULL
);
INSERT INTO my_table VALUES
(1,'FName','John'),
(2,'LName','Smith'),
(3,'Email','JSmith@gmail.com'),
(4,'event_0','Movies'),
(5,'event_1','Dinner'),
(6,'FName','Mike'),
(7,'LName','Jones');
SELECT MAX(CASE WHEN attribute = 'fname' THEN value END) fname
, MAX(CASE WHEN attribute = 'lname' THEN value END) lname
, MAX(CASE WHEN attribute = 'email' THEN value END) email
FROM
( SELECT CASE WHEN attribute = 'fname' THEN @entity := @entity+1 ELSE @entity:=@entity END entity
, attribute
, value
FROM my_table
, (SELECT @entity := 0) vars
ORDER
BY id
) x
GROUP
BY entity
HAVING MAX(attribute LIKE 'event_%' AND value = 'Movies') = 1;
+-------+-------+--------------+
| fname | lname | email |
+-------+-------+--------------+
| John | Smith | JSmith@gmail |
+-------+-------+--------------+
答案 3 :(得分:0)
您的数据模型已损坏。您没有一种简单的方法来确定将哪些行分配给相同的“人”或“实体”。您应该有另一列。请记住:SQL表表示无序集,因此行的排序不是识别事物的有效方法。
如果您想看电影的人数众多,怎么办?
select count(*)
from t
where fieldname in ('event_0', 'event_1', 'event_2') and
fieldvalue = 'Movies';
这将获得电影的行数,这似乎与您想要的非常接近。