在MySQL 5.5.x中,如何根据独立表中的元数据对主表进行排序



我希望能得到一些关于SQL问题的建议。。。

我们有一个包含很少信息的主表(MySQL 5.5.x)。我们还有一个元数据表,它存储变量/值对并引用主表。我遇到的问题是,我们需要使用JOIN来检索信息,以组合两个表,但我们需要根据特定的元数据对输出进行排序。下面这个琐碎的例子将会说明。

这是该模式的一个超级提炼版本:

CREATE TABLE fundraise (
id        INTEGER NOT NULL,
charity   TEXT NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE meta (
master_id INTEGER REFERENCES fundraise(id),
variable  TEXT NOT NULL,
value     TEXT NOT NULL
);

然后,我们为所有三家慈善机构输入一些信息:

INSERT INTO fundraise(id, charity) VALUES
(1, 'save the dolphins'),
(2, 'feed the kids'),
(3, 'cloth the homeless');

我们还插入了一些元数据:

INSERT INTO meta(master_id, variable, value) VALUES
(1, 'name',   'Mike'), (1, 'priority', 'high'),     (1, 'start','2016'),
(2, 'name',   'Barb'), (2, 'priority', 'veryhigh'), (2, 'start','2012'),
(3, 'name',   'Sam'),  (3, 'priority', 'veryhigh'), (3, 'start','2013');

请注意,元数据变量"start"旨在用作所需报表的排序顺序。以下是我用来生成报告的SQL语句(未排序):

SELECT   f.charity, m.variable, m.value
FROM     fundraise f 
LEFT OUTER JOIN meta m ON (f.id = m.master_id);

我得到的输出在很大程度上似乎是正确的,只是我们还没有排序:

+--------------------+----------+----------+|慈善|变量|价值|+--------------------+----------+----------+|拯救海豚|名字|迈克||拯救海豚|优先级|高||拯救海豚|开始|2016||喂孩子|名字| Barb||喂养孩子|优先级|非常高||喂养孩子|开始| 2012||给无家可归的人穿衣服||为无家可归者布衣|优先级|很高||布衣无家可归者|开始| 2013|+--------------------+----------+----------+

但我真正需要的是在"开始"的一年中对其进行排序显示,同时将特定慈善机构的所有细节放在一起。换句话说,我需要按年度查看报告顺序,如下所示:

+--------------------+----------+----------+|慈善|变量|价值|+--------------------+----------+----------+|喂孩子|名字| Barb||喂养孩子|优先级|非常高||喂养孩子|开始| 2012||给无家可归的人穿衣服||为无家可归者布衣|优先级|很高||布衣无家可归者|开始| 2013||拯救海豚|名字|迈克||拯救海豚|优先级|高||拯救海豚|开始|2016|+--------------------+----------+----------+

但我不知道该怎么做。。。有人对如何专门使用SQL执行此操作有任何建议吗?!?!

请提前感谢!

p.s.,我想指出的是,我使用的实际系统要复杂得多,上面的演示是一个相当做作的演示,以简化问题的提问。

试试这个。

SELECT * FROM (SELECT  f.id AS id,f.charity, m.variable, m.value FROM     fundraise f  RIGHT OUTER JOIN meta m ON (f.id = m.master_id) GROUP BY value HAVING (variable = 'start') ORDER BY value) as sorted_table LEFT JOIN meta m2 ON sorted_table.id = m2.master_id ORDER BY sorted_table.value

这是我使用该查询得到的结果。

MariaDB [fbb]> SELECT * FROM (SELECT  f.id AS id,f.charity, m.variable, m.value FROM     fundraise f  RIGHT OUTER JOIN meta m ON (f.id = m.master_id) GROUP BY value HAVING (variable = 'start') ORDER BY value) as sorted_table LEFT JOIN meta m2 ON sorted_table.id = m2.master_id ORDER BY sorted_table.value
-> ;
+------+--------------------+----------+-------+-----------+----------+----------+
| id   | charity            | variable | value | master_id | variable | value    |
+------+--------------------+----------+-------+-----------+----------+----------+
|    2 | feed the kids      | start    | 2012  |         2 | name     | Barb     |
|    2 | feed the kids      | start    | 2012  |         2 | priority | veryhigh |
|    2 | feed the kids      | start    | 2012  |         2 | start    | 2012     |
|    3 | cloth the homeless | start    | 2013  |         3 | name     | Sam      |
|    3 | cloth the homeless | start    | 2013  |         3 | priority | veryhigh |
|    3 | cloth the homeless | start    | 2013  |         3 | start    | 2013     |
|    1 | save the dolphins  | start    | 2016  |         1 | name     | Mike     |
|    1 | save the dolphins  | start    | 2016  |         1 | priority | high     |
|    1 | save the dolphins  | start    | 2016  |         1 | start    | 2016     |
+------+--------------------+----------+-------+-----------+----------+----------+
9 rows in set (0.01 sec)
MariaDB [fbb]> 

最新更新