Смешайте строки SQL в один - PullRequest
0 голосов
/ 05 мая 2018

Я использую следующий SQL-запрос:

SELECT package_stats.developer 
      ,xf_user.username 
      ,xf_user.email 
      ,xf_user_profile.homepage 
      ,xf_user_profile.location 
      ,xf_user_profile.about 
      ,CASE WHEN field_id ='Github' THEN field_value ELSE '' END AS Github
      ,CASE WHEN field_id ='Repository' THEN field_value ELSE ''  END AS Repository
      ,CASE WHEN field_id ='twitter' THEN field_value ELSE '' END AS Twitter

FROM package_stats, xf_user, xf_user_field_value, xf_user_profile 
WHERE xf_user.username = package_stats.developer AND  xf_user_profile.user_id = xf_user.user_id AND xf_user_field_value.user_id = xf_user.user_id AND xf_user_field_value.field_value <> '' 

Что выводит следующее:

developer   username    email      about     Github              Repository           Twitter 
John Doe      jdoe    j@doe.com   It's me   https://github....       
John Doe      jdoe    j@doe.com   It's me      
John Doe      jdoe    j@doe.com   It's me                       https://link....   
John Doe      jdoe    j@doe.com   It's me                                            https://twitter.com/...

Как я могу смешать все эти строки в одну строку?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Я считаю, что вы можете использовать условное агрегирование:

SELECT ps.developer, u.username, u.email, 
       up.homepage, up.location, up.about,
       MAX(CASE WHEN ufv.field_id = 'Github' THEN ufv.field_value END) AS Github,
       MAX(CASE WHEN ufv.field_id = 'Repository' THEN ufv.field_value END) AS Repository,
       MAX(CASE WHEN ufv.field_id = 'twitter' THEN ufv.field_value END) AS Twitter   
FROM package_stats ps JOIN
     xf_user u
     ON u.username = ps.developer JOIN
     xf_user_profile up
     ON up.user_id = u.user_id JOIN
     xf_user_field_value ufv
     ON ufv.user_id = u.user_id 
WHERE ufv.field_value <> '' 
GROUP BY ps.developer, u.username, u.email, 
         up.homepage, up.location, up.about;

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Во всех столбцах следует указывать псевдоним таблицы, чтобы избежать двусмысленности.
  • Нет смысла иметь для этой цели предложение ELSE. Если совпадений нет, столбец будет NULL (разумное значение).
  • Если для данной категории может быть более одного поля, используйте GROUP_CONCAT().
0 голосов
/ 05 мая 2018

Вы можете использовать (ложную) функцию агрегирования и группировать по

SELECT package_stats.developer 
      ,xf_user.username 
      ,xf_user.email 
      ,xf_user_profile.homepage 
      ,xf_user_profile.location 
      ,xf_user_profile.about 
      ,min(CASE WHEN field_id ='Github' THEN field_value END) AS Github
      ,min(CASE WHEN field_id ='Repository' THEN field_value   END) AS Repository
      ,min(CASE WHEN field_id ='twitter' THEN field_value END ) AS Twitter

    FROM package_stats
    INNER JOIN  xf_user ON xf_user.username = package_stats.developer
    INNER JOIN  xf_user_profile  ON xf_user_profile.user_id = xf_user.user_id 
    INNER JOIN  xf_user_field_value v1 ON xf_user_field_value.user_id = xf_user.user_id 
    WHERE xf_user_field_value.field_value <> '' 
    GROUP BY package_stats.developer 
      ,xf_user.username 
      ,xf_user.email 
      ,xf_user_profile.homepage 
      ,xf_user_profile.location 
      ,xf_user_profile.about

и не использовать имплицитные объединения не понятны ..
имплицитное соединение - это синтаксический аркаик

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