SQL: извлечь несколько строк из одной записи - PullRequest
0 голосов
/ 01 июня 2011

У меня есть таблица "Photo_users", такая как:

ID Имя Фамилия Title1 Title2

, где Title1 и Title 2 - это названия двух фотографий, загруженныхПользователь "Имя Фамилия".Я хотел бы экспортировать список названий фотографий с соответствующим автором (конечно, у каждого автора есть максимум 2 фотографии):

Name Surname Title1
Name Surname Title2
...
...
...

Я знаю, что структура БД не самая лучшая для того, что я хочуделай, но это то, что у меня есть.

Любой намек?Спасибо!:)

Ответы [ 4 ]

3 голосов
/ 01 июня 2011
select name, surname, title1 from photo_users
union all
select name, surname, title2 from photo_users

При необходимости добавьте дополнительные NULL проверки или измените UNION ALL на UNION, чтобы избежать дублирования

2 голосов
/ 01 июня 2011
SELECT
  u.Name,
  u.Surname,
  CASE x.t
    WHEN 1 THEN u.Title1
    WHEN 2 THEN u.Title2
  END AS Title
FROM Photo_users u
  CROSS JOIN (SELECT 1 AS t UNION ALL SELECT 2) x
2 голосов
/ 01 июня 2011
SELECT name, surname, title1 AS title
FROM photo_users
UNION
SELECT name, surname, title2 AS title
FROM photo_users

И если вы хотите, чтобы он был отсортирован / отфильтрован ....

SELECT *
FROM (
    SELECT name, surname, title1 AS title
    FROM photo_users
    WHERE id>100
    UNION
    SELECT name, surname, title2 AS title
    FROM photo_users
    WHERE id>100
) AS ilv
ORDER BY surname, name;
1 голос
/ 01 июня 2011
( SELECT name
       , surname
       , title1 AS title
  FROM photo_users
  WHERE title1 IS NOT NULL
)
UNION ALL
( SELECT name
       , surname
       , title2 AS title
  FROM photo_users
  WHERE title2 IS NOT NULL
)

Но сначала рассмотрим нормализацию вашей таблицы.

Это действительно так просто, как

  • добавление другой таблицы photo споля title и userid (внешний ключ к таблице photo_users) и другие связанные и ненормализованные поля (например, photo), которые вы, вероятно, имеете.
  • передача данных (заголовков и других связанных полей) изтаблица, которую вы используете для новой
  • , опуская поле title из таблицы photo_users

После этого вы сможете

  • записатьэтот запрос (и все другие запросы, использующие фотографии / заголовки) с простыми JOIN
  • , а не со сложными и, возможно, медленными UNION запросами
  • , сохранили более двух фотографий дляпользователь
  • сохранил менее двух фотографий для некоторых пользователей, не указав NULL в соответствующих полях.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...