编写查询以显示参加指定事件的人员列表的最佳方法是什么?

时间:2019-06-07 05:14:04

标签: mysql sql

我不习惯在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。

感谢您的帮助!谢谢!

4 个答案:

答案 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';

这将获得电影的行数,这似乎与您想要的非常接近。