2010-10-21 8 views
1

Я пытаюсь показать городам и почтовым индексам конкретный город в.mysql multiple-subquery group_concat query

Моя база данных довольно хорошо структурирована, с таблицей, такой как город, почтовый индекс и город. Существуют также таблицы для каждого из отношений city_postcode & city_borough.

В идеале я хочу возвращенные данные, как:

"Abbey Wood", "SE2", "Бекслей, Гринвич" "Барбакан", "EC1, EC2", "Лондон Сити"

Я пробовал несколько разных подходов, и я близок, но пока нет.

Любая помощь будет оценена ... :) До сих пор я пытался

SELECT DISTINCT t.town, 
GROUP_CONCAT(DISTINCT p.postcode SEPARATOR ', ') AS 'postcode', 
GROUP_CONCAT(DISTINCT b.borough SEPARATOR ', ') AS 'borough' 
FROM coverage_towns AS t, 
coverage_boroughs AS b, 
coverage_postcodes AS p, 
coverage_towns_boroughs AS tb, 
coverage_towns_postcodes AS tp 
WHERE t.id = tp.town_id 
AND p.id = tp.postcode_id 
AND b.id = tb.borough_id 
GROUP BY t.town 
ORDER BY t.town ASC 

Который возвращает

"Abbey Wood", "SE2", "Southwark, Hammersmith and Fulham, Tower Hamlets, Wandsworth, Enfield, Newham, LOTS MORE HERE" 
"Barbican", "EC1, EC2", "Brent, Greenwich, Kensington and Chelsea, Westminster, Camden, LOTS MORE HERE" 

Я также попытался

SELECT DISTINCT t.town, (

SELECT SQL_CACHE DISTINCT GROUP_CONCAT(p1.postcode 
SEPARATOR ', ') 
FROM coverage_postcodes AS p1 
WHERE p1.id = tp.postcode_id 
) AS 'postcode', (

SELECT SQL_CACHE DISTINCT GROUP_CONCAT(b1.borough 
SEPARATOR ', ') 
FROM coverage_boroughs AS b1 
WHERE b1.id = tb.borough_id 
) AS 'borough' 
FROM coverage_towns AS t, coverage_boroughs AS b, coverage_postcodes AS p, coverage_towns_boroughs AS tb, coverage_towns_postcodes AS tp 
WHERE t.id = tp.town_id 
AND p.id = tp.postcode_id 
AND b.id = tb.borough_id 
GROUP BY t.town 
ORDER BY t.town ASC 

Какие возвращается

"Abbey Wood", "SE2", "Greenwich" 
"Acton", "W3", "Greenwich" 
"Aldersbrook", "E12", "Greenwich" 

ответ

1

Первый запрос выглядит хорошо, просто добавьте distinct внутри group_concat, как:

SELECT t.town 
,  GROUP_CONCAT(DISTINCT p.postcode SEPARATOR ', ') AS 'postcode' 
,  GROUP_CONCAT(DISTINCT b.borough SEPARATOR ', ') AS 'borough' 
<more code here> 
GROUP BY 
     t.town 
+0

Это, конечно, улучшение на колонке the2nd, но теперь я получаю "Abbey Wood", "SE2", "Саутварк, Хаммерсмит и Фулхэм, Tower Hamlets Уондзуотского, Enfield, Newham, МНОГО ЕЩЕ ЗДЕСЬ" " Барбикан "," EC1, EC2 "," Брент, Гринвич, Кенсингтон и Челси ", Вестминстер, Камден, ПОТЕРИ БОЛЬШЕ ЗДЕСЬ" где я ищу: "Abbey Wood", "SE2", "Bexley, Greenwich « « Барбикан »,« EC1, EC2 »,« Город Лондон » – user482957

+1

@ user482957: вам не хватает ссылки между' tb' и 't', в предложении' where' – Andomar

1

РЕШЕНИЕ

я вернулся к вопросу после хорошего кофе и ответ позиционировал себя.

SELECT DISTINCT t.town, 
GROUP_CONCAT(DISTINCT p.postcode SEPARATOR ', ') AS 'postcode', 
GROUP_CONCAT(DISTINCT b.borough SEPARATOR ', ') AS 'borough' 
FROM towns AS t, boroughs AS b, postcodes AS p, towns_boroughs AS tb, towns_postcodes AS tp 
WHERE (t.id = tp.town_id AND t.id = tb.town_id) 
AND (p.id = tp.postcode_id AND b.id = tb.borough_id) 
GROUP BY t.town 
ORDER BY t.town ASC