Как я могу вернуть каждую запись, связанную со штатом и городом, при возврате названия штата и города только один раз? (MySql) - PullRequest
0 голосов
/ 13 июля 2020

Я не совсем уверен, как это задать, и я какое-то время занимался поиском и не нашел ничего полезного.

Допустим, у меня есть следующие три таблицы People, Cities и States:

PeopleID |   Name   |    Age   | CityIDFK
--------------------------------------------
     1   |   John   |    24    |      20 
     2   |   Jim    |    28    |      21 
     3   |   Joan   |    49    |      10 
     4   |   Mike   |    37    |      10 
     5   |   Bruce  |    26    |      2 
     6   |   Peter  |    22    |      20 
     7   |   Oprah  |    27    |      3 
     7   |   Jake   |    21    |      1 
CityIDPK |    City     |   StateIDFK
---------------------------------------
     1     |  Seattle    |      1 
     2     |  Gotham     |      2 
     3     |  Oakland    |      4 
     10    |  Boise      |      5 
     20    |  Austin     |      6 
     21    |  Tyler      |      6
StateIDPK    |   StateName
----------------------------
      1      |   Washington
      2      |   New York
      3      |   Oregon
      4      |   California
      5      |   Idaho
      6      |   Texas

Как я могу добиться следующего вывода:

    StateName |   City     |    Name    
---------------------------------------
California    |   Oakland  |    Oprah  
Idaho         |   Boise    |    Mike  
              |            |    Joan
New York      |   Gotham   |    Bruce
Washington    |   Seattle  |    Jake
Texas         |   Austin   |    John
              |            |    Peter
              |   Tyler    |    Jim

Я не уверен, что результат выше возможно или нет, я бы, вероятно, просто сделал что-то вроде этого:

SELECT StateName, City, Name FROM People
INNER JOIN Cities
ON Cities.CityIDPK = People.CityIDFK
INNER JOIN States
ON States.StateIDPK = Cities.StateIDFK

Но это вернет StateName и City для каждого человека, а не только один раз.

    StateName |   City     |    Name    
---------------------------------------
California    |   Oakland  |    Oprah  
Idaho         |   Boise    |    Mike  
Idaho         |   Boise    |    Joan 
New York      |   Gotham   |    Bruce
Washington    |   Seattle  |    Jake
Texas         |   Austin   |    John
Texas         |   Austin   |    Peter
Texas         |   Tyler    |    Jim

Если результат, которого я хочу достичь, возможен, может ли кто-нибудь показать мне пример написания запроса или указать мне правильное направление?

1 Ответ

0 голосов
/ 13 июля 2020

Я согласен с Тимом, это должно быть выполнено на вашем уровне представления.

Но вы можете сделать это, если используете MySQL 8, воспользовавшись преимуществами оконных функций . Мы можем использовать row_number() для определения первой строки для каждого штата и для каждого города, а затем использовать case , чтобы отображать имя только для первой строки.

SELECT
  case row_number() over states_w
    when 1 then states.name
    else '' end as StateName,
  case row_number() over cities_w
    when 1 then cities.name
    else '' end as CityName,
  people.name as Name
FROM People
INNER JOIN Cities ON Cities.id = People.City_id
INNER JOIN States ON States.id = Cities.state_id
window states_w as (partition by states.id),
  cities_w as (partition by cities.id);

Если вы используете MySQL до 8 ... обновите. Если вы не можете обновить , его можно эмулировать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...