Сделать строки объединенной таблицы именами полей и значениями основного запроса? - PullRequest
0 голосов
/ 01 марта 2019

Можно ли сделать строки объединенной таблицы именами полей и значениями основного запроса?Позвольте мне объяснить, что, показывая структуру и данные:

structs
    id
    type

struct_fields
    id
    struct_id
    name
    value

Пример данных:

structs
    1, faq
    2, faq
    3, post

struct_fields
    1, 1, "question", "Will there be food?" 
    2, 1, "answer", "No, you will have to bring your own food"
    3, 1, "active", 1
    4, 2, "question", "Will there be drinks?"
    5, 2, "answer", "Yes, there will be plenty of drinks"
    6, 2, "active", 0
    7, 3, "title", "Great post!"
    8, 3, "body", "Lorum ipsum..."
    9, 3, "published", "2019-01-01 23:12:00"

Это даст мне все структуры типа faq со всеми соответствующими полями

SELECT s.*, f.*
FROM `structs` s
RIGHT JOIN `struct_fields` f ON f.struct_id = s.id
WHERE s.type = 'faq' 

Но в моих строках, очевидно, есть двойники, потому что все struct_fields также генерируют строки

Но когда я добавляю

GROUP BY s.id 

, только первая строка совпадающих полей struct_fieldsпоказано (phpmyadmin) и с именами полей struct_fields.

Я бы хотел иметь возможность выбрать все структуры со всеми соответствующими struct_fields, где имя struct_fields будет именем поля в результате изначение struct_field, чтобы я мог использовать HAVING, чтобы сделать выбор.Итак:

Результат:

id, type, question,                answer,          active
1,  faq,  "Will there be food?",   "No, you...",    1
2,  faq,  "Will there be drinks?", "Yes, there...", 0

Так что теперь я смогу расширить запрос такими вещами, как:

в случае часто задаваемых вопросов, например: HAVING active = 1 (or WHERE active = 1)

в случае сообщения, например: WHERE published > DATE_SUB(NOW(), INTERVAL 1 DAY)

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете попробовать ниже - используя conditional aggregation and Join

select s.id,s.type,question, answer, active from FROM `structs` s
inner join
(
select struct_id, max(case when name='question' then value end) as question,
max(case when name='answer' then value end) as answer,
max(case when name='active' then value end) as active
from struct_fields group by struct_id
)f ON f.struct_id = s.id WHERE s.type = 'faq'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...