Как лучше написать запрос, чтобы показать список людей, идущих на указанное событие? - PullRequest
0 голосов
/ 07 июня 2019

Я не привык к таблицам 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 голосов
/ 07 июня 2019

Ваша модель данных повреждена.У вас нет простого способа определить, какие строки назначены одному и тому же «человеку» или «объекту».У вас должен быть другой столбец.Помните: таблицы SQL представляют неупорядоченные наборы, поэтому упорядочение строк не является допустимым способом идентификации чего-либо.

Если вы хотите, чтобы число людей, идущих в кино, было следующим:

select count(*)
from t
where fieldname in ('event_0', 'event_1', 'event_2') and
      fieldvalue = 'Movies';

Это число строк с фильмами, которое кажется довольно близким к тому, что вы хотите.

0 голосов
/ 07 июня 2019

Я надеюсь, что это может решить ваш первый запрос, где вы можете проверить, сколько людей идет на фильмы, а также на другие мероприятия.

SELECT COUNT(ID), FieldValue
FROM table_name
GROUP BY FieldValue;
0 голосов
/ 07 июня 2019

Вот о чем подумать ... решение исключительно для версий MySQL до 8.0.

Это абсолютно зависит от контактных данных, последовательно предшествующих событиям.

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 |
+-------+-------+--------------+
0 голосов
/ 07 июня 2019

Ваша таблица выглядит как таблица, с которой мне приходилось иметь дело в прошлом, у клиента была таблица со столбцами в виде записей вместо строк, чтобы настроить поля в форме (столбец для каждого имени поля и столбец дляего значения).

То, как я справился с этим, было: - создание сводной таблицы с использованием CASE WHEN для каждой строки ...

Я объясню вам, как с некоторым кодом в паречасов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...