В операторе SQL с несколькими SELECTS, как я могу поставить основной идентификатор только один раз? - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть оператор SQL, который собирает много информации из нескольких таблиц в моем приложении Android, используя SQLite3. В настоящее время я должен вставить основной идентификатор в нескольких местах, и я хотел бы знать, есть ли способ уменьшить это, чтобы мне нужно было только ввести идентификатор один раз (примечание - идентификатор вставляется там, где в настоящее время находятся знаки вопроса) есть - можно ли уменьшить это, чтобы у меня был только один знак вопроса?):

SELECT m.movie_id, m.title, m.synopsis, m.review, m.certificate, m.duration, m.release_year, actors, directors, genres, video_url, video_title, video_thumbnail_url
FROM movies m
INNER JOIN 
(
  SELECT v.video_url as video_url, v.title as video_title, v.thumbnail_url as video_thumbnail_url, m.movie_id 
  FROM movies m
  LEFT JOIN videos v 
  ON m.movie_id = v.movie_id
  WHERE m.movie_id = ?
  ORDER BY v.insert_order 
  LIMIT 1
) trailer_group
ON trailer_group.movie_id = m.movie_id, 
(
  SELECT movie_id, group_concat(name, ', ') actors 
  FROM
    (
      SELECT m.movie_id, a.name
      FROM movies m
      LEFT JOIN movie_actors a
      ON m.movie_id = a.movie_id
      WHERE m.movie_id = ?
      ORDER BY m.movie_id, a.insert_order
    ) 
) actor_group
ON actor_group.movie_id = m.movie_id, 
(
  SELECT movie_id, group_concat(name, ', ') directors 
  FROM
    (
      SELECT m.movie_id, d.name
      FROM movies m
      LEFT JOIN movie_directors d
      ON m.movie_id = d.movie_id
      WHERE m.movie_id = ?
      ORDER BY m.movie_id, d.insert_order
    ) 
) director_group 
ON director_group.movie_id = m.movie_id, 
(
  SELECT movie_id, group_concat(name, ', ') genres 
  FROM
    (
      SELECT m.movie_id, g.name
      FROM movies m
      LEFT JOIN movie_genres g
      ON m.movie_id = g.movie_id
      WHERE m.movie_id = ?
      ORDER BY m.movie_id, g.insert_order
    ) 
) genre_group 
ON genre_group.movie_id = m.movie_id

1 Ответ

0 голосов
/ 23 ноября 2011

Синтаксис SQLLite, кажется, немного отличается от того, к чему я привык, но вы должны иметь возможность перечислить предикат только один раз:

SELECT * from movies m
LEFT JOIN videos v ON v.movie_id = m.movie_id
LEFT JOIN actors a ON a.movie_id = m.movie_id
...
WHERE m.movie_id = ?

Если нет чего-то, что я пропускаю, не должно быть причин перечислять это несколько раз.

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