2017-02-17 25 views
0

人,我有一個很難拿出一個SQL會爲我提供以下的輸出:mysql命令通過匹配第一個錶行再休息

ID|CITY_SLUG|BAIRRO|NEIGHBORHOOD_BAIRRO|CIDADE|UF|STATE_SLUG 
4444|4444|Porto Alegre do Norte 
5671|5671|Porto Alegre do Piauí 
7994|7994|Porto Alegre 
9919|9919|Porto Alegre do Tocantins 
12538|12538|Linha Porto Alegre 
12538|12538|Centro|63310|Linha Porto Alegre|RS|rs 
7994|7994|Aberta dos Morros|13460|Porto Alegre|RS|rs 
4444|4444|Centro|38981|Porto Alegre do Norte|MT|mt 
5671|5671|Centro|39387|Porto Alegre do Piauí|PI|pi 
9919|9919|Setor Central|32994|Porto Alegre do Tocantins|TO|to 
4444|4444|Centro|38981|Porto Alegre do Norte|MT|mt 
5671|5671|Centro|39387|Porto Alegre do Piauí|PI|pi 
7994|7994|Aberta dos Morros|13460|Porto Alegre|RS|rs 

的想法是先列出城市然後列出匹配的城市名稱的鄰里,這是我的SQL:

Select 
CITY.ID, 
CITY.SLUG as CITY_SLUG, 
NEIGHBORHOOD.NAME as BAIRRO, 
NEIGHBORHOOD.SLUG AS NEIGHBORHOOD_BAIRRO, 
CITY.NAME as CIDADE, 
STATE.ABB AS UF, 
STATE.SLUG AS STATE_SLUG 
from CITY 
LEFT OUTER join STATE on CITY.ID_STATE=STATE.ID 
LEFT OUTER join NEIGHBORHOOD on NEIGHBORHOOD.ID_CITY = CITY.ID 
WHERE (CITY.NAME LIKE '%PORTO ALE%') 
+1

我認爲源表上的某些上下文是必需的。 – Alfabravo

+1

'JOIN'在結果的同一行中組合了相關的行。你想要在不同的行中的鄰居?你需要使用'UNION'把東西放在不同的行中。 – Barmar

回答

0

正如@Barmar提到的,首先提取排有匹配的城市名稱,然後創建一個UNION具有鄰爲匹配城市名行。添加相關邏輯來忽略具有NULL值的列:

Select 
CITY.ID, 
CITY.SLUG as CITY_SLUG, 
NEIGHBORHOOD.NAME as BAIRRO, 
NULL, 
NULL, 
NULL, 
NULL 
from CITY 
LEFT OUTER join STATE on CITY.ID_STATE=STATE.ID 
LEFT OUTER join NEIGHBORHOOD on NEIGHBORHOOD.ID_CITY = CITY.ID 
WHERE (CITY.NAME LIKE '%PORTO ALE%') 
UNION 
Select 
CITY.ID, 
CITY.SLUG as CITY_SLUG, 
NEIGHBORHOOD.NAME as BAIRRO, 
NEIGHBORHOOD.SLUG AS NEIGHBORHOOD_BAIRRO, 
CITY.NAME as CIDADE, 
STATE.ABB AS UF, 
STATE.SLUG AS STATE_SLUG 
from CITY 
LEFT OUTER join STATE on CITY.ID_STATE=STATE.ID 
LEFT OUTER join NEIGHBORHOOD on NEIGHBORHOOD.ID_CITY = CITY.ID 
WHERE (CITY.NAME LIKE '%PORTO ALE%') 
+1

我修改了一下,以匹配實際的列...謝謝 –