SQL VIEW возвращает только первую запись - PullRequest
0 голосов
/ 02 июля 2011

Я не уверен, что здесь происходит.Я создал представление MySQL и получил некоторые данные из 4 разных таблиц, но, похоже, он возвращает только первую запись.

CREATE OR REPLACE VIEW request_view AS
  SELECT
    TRequest.id,
    TRequest.minutes_required,
    TRequest.expires_at,
    User.name AS author,
    TRequest.abstract_text,
    TRequest.full_text,
    TGroup.name AS tgroup,
    SUM(TOrder.minutes) AS total_minutes
  FROM
    TRequest

  JOIN User ON TRequest.author_id = User.id
  LEFT JOIN TGroup ON TRequest.group_id = TGroup.id
  LEFT JOIN TOrder ON TRequest.id = TOrder.request_id

  ORDER BY TRequest.created_at;

Когда я пытаюсь выбрать это представление, он возвращает только первуюзапись:

mysql> select id from request_view;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

mysql> select id from request_view where id=2;
Empty set (0.00 sec)

У меня есть 30 строк TRequest ... есть ли вообще возможность получить представление для возврата всех записей TRequest?Или я просто неправильно использую вид?

Ответы [ 2 ]

1 голос
/ 02 июля 2011

Вы делаете SUM без GROUP BY. SUM - агрегатная функция, которая имеет смысл только для группы строк. Если вы не указываете столбцы для группировки, по умолчанию берется сумма по всем строкам, что означает, что вы получите только один результат.

Если вам нужна одна строка для каждого столбца в TRequest, попробуйте добавить GROUP BY TRequest.id к определению вашего представления.

0 голосов
/ 02 июля 2011

Значение по умолчанию join - inner join, поэтому эта строка может отфильтровать строки:

 JOIN User ON TRequest.author_id = User.id

Что произойдет, если вы замените его на:

 LEFT JOIN User ON TRequest.author_id = User.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...