繁体   English   中英

mySql - 从表中获取相关值

[英]mySql - get related values from table

好吧,我会尽可能地保持清醒,但请忍受我 - 这是一个漫长的一周:)

我们有一个表格,结构如下:

+----+----------+---------+------------------+
| id | field_id | user_id |      value       |
+----+----------+---------+------------------+
|  1 | Country  |       2 | USA              |
|  2 | Country  |       3 | USA              |
|  3 | Country  |       4 | CA               |
|  4 | Country  |       5 | MX               |
|  5 | Province |       2 | FL               |
|  6 | Province |       3 | GA               |
|  7 | Province |       4 | British Columbia |
|  8 | Province |       5 | Sonara           |
|  9 | City     |       2 | Orlando          |
| 10 | City     |       3 | Brunswick        |
| 11 | City     |       4 | Vancouver        |
| 12 | City     |       5 | Nogalas          |
+----+----------+---------+------------------+`

我们需要(希望)一个查询返回所有Country - State / Province - City组合,以便动态生成JSON文件。

有效的东西

"SELECT all Provinces and Cities WHERE Country = 'USA'"

(但当然,我们的db表的结构 - 遗憾的是无法更改 - 它的复杂程度要高得多。

共享共同“user_id”的任何值可以安全地假设为“一起”(即,user_id 2具有“USA”表示“Country”,“FL”表示“省”,“Orlando”表示“City” )。

最终结果我们试图创建一个类似于下面的json文件。

{
"USA": {
    "Florida": [
        {"City": "Orlando"},
        {"City": "Palm Beach"}
    ],
    "Georgia": [
        {"City": "Atlanta"},
        {"City": "Brunswick"}
    ]
}, 
"Canada": {
    "Alberta": [
        {"City": "Calgary"}
    ],
    "Ontario": [
        {"City": "Atlanta"},
        {"City": "Brunswick"}
    ]
}
}

有了这个查询和一些循环的结果,你应该能够根据需要生成你的Json

SQL小提琴

MySQL 5.6架构设置

CREATE TABLE t
    (`id` int, `field_id` varchar(8), `user_id` int, `value` varchar(16))
;

INSERT INTO t
    (`id`, `field_id`, `user_id`, `value`)
VALUES
    (1, 'Country', 2, 'USA'),
    (2, 'Country', 3, 'USA'),
    (3, 'Country', 4, 'CA'),
    (4, 'Country', 5, 'MX'),
    (5, 'Province', 2, 'FL'),
    (6, 'Province', 3, 'GA'),
    (7, 'Province', 4, 'British Columbia'),
    (8, 'Province', 5, 'Sonara'),
    (9, 'City', 2, 'Orlando'),
    (10, 'City', 3, 'Brunswick'),
    (11, 'City', 4, 'Vancouver'),
    (12, 'City', 5, 'Nogalas')
;

查询1

SELECT 
    tc.`value` as Country,  
    tp.`value` as Province,  
    tcy.`value` as City
FROM (
        SELECT `value`, user_id FROM t WHERE field_id = "Country"
    ) as tc
    LEFT JOIN (
            SELECT `value`, user_id FROM t WHERE field_id = "Province"
        ) as tp
        ON tc.user_id = tp.user_id
    LEFT JOIN (
            SELECT `value`, user_id FROM t WHERE field_id = "City"
        ) as tcy
        ON tp.user_id = tcy.user_id

结果

|Country|         Province |      City |
|-------|------------------|-----------|
|   USA |               FL |   Orlando |
|   USA |               GA | Brunswick |
|    CA | British Columbia | Vancouver |
|    MX |           Sonara |   Nogalas |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM