2016-11-19 2 views
1

ОК я буду стараться быть ясно, как я могу, но иметь со мной - его была долгая неделя :)MySql - получить связанные значения из таблицы

У нас есть таблица, которая строится, как показано ниже:

+----+----------+---------+------------------+ 
| 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   | 
+----+----------+---------+------------------+` 

и мы нуждаясь (в надежде на) запрос, чтобы вернуть все Страна - Штат/провинция - комбинации Город с целью динамического создания файла в формате JSON.

Что-то эффект

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

(но, конечно, со структурой нашей таблицы БД - которая, к сожалению, не может быть изменен. - его совсем немного сложнее

Любой из значения, которые имеют общий «user_id», можно смело предполагать «идти вместе» (т.е. user_id 2 имеет «USA» для «Country», «FL» для «Province» и «Orlando» для «City»).

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

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

, разместив свой стол в качестве изображения вы будучи полной противоположностью того, чтобы быть как можно более четкими. Отправьте таблицу как текст, а также несколько строк в виде текста – e4c5

+0

Хорошая точка, e4c5. Одна сек ... – user2614806

+0

отредактировал мой оригинальный вопрос, чтобы удалить изображение и добавить структуру таблицы в качестве кода. – user2614806

ответ

0

С результатом этого запроса и некоторой петли вы должны быть в состоянии генерировать свой JSon как вы хотите

SQL Fiddle

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 

Results:

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

Это на самом деле ... блестяще. Спасибо! – user2614806

+0

@ пользователь2614806 добро пожаловать! ; BTW, если вы хотите только одну строку для каждого города (2 пользователя или более в одном городе), вы можете переключить 'SELECT' для' SELECT DISTINCT' – Blag

+0

. Кажется, я не вижу, чтобы аспект DISTINCT работал над этим запросом , Независимо от того, где я размещаю DISTINCT, я все равно получаю дубликаты. То, что я хотел бы сделать, это настроить запрос на возвращение отдельных стран или провинций или штатов в зависимости от того, где я размещаю DISTINCT. – user2614806