как оптимизировать соединение таблиц - PullRequest
0 голосов
/ 03 марта 2020

hellow. У меня есть 3 таблицы, как показано ниже;

Mov ie Таблица, как это:

+------+-------+-----+
| id   | name  |     |
+------+-------+-----+
+------+-------+-----+
| 1    | got   |     |
+------+-------+-----+
+------+-------+-----+
| 2    | Drive |     |
+------+-------+-----+
+------+-------+-----+
| 3    | Thor  |     |
+------+-------+-----+

Janra :

+------+-------------+
| id   | janra_name  |
+------+-------------+
+------+-------------+
| 1    | action      |
+------+-------------+
+------+-------------+
| id   | comedy      |
+------+-------------+

Movie_janra: (movie_id - это внешний ключ для идентификатора в таблице mov ie)

+--------+-------------+
| mov_id |  janra_id   |
+--------+-------------+
+--------+-------------+
| 1      | 1           |
+--------+-------------+
+--------+-------------+
| 1      | 2           |
+--------+-------------+

nation Таблица:

 +------+-------------+
    | id   | name        |
    +------+-------------+
    +------+-------------+
    | 1   | us           |
    +------+-------------+
    +------+-------------+
    | 2   | uk           |
    +------+-------------+
* Таблица 1020 * movie_nation:
    +------+-------------+
    |mov_id| nation_id   |
    +------+-------------+
    +------+-------------+
    | 1    |      1      |
    +------+-------------+
    +------+-------------+
    | 1    |      2      |
    +------+-------------+

, тогда я использую запрос следующим образом:

SELECT *
FROM
  (SELECT movie.id,
          movie.name,
          f.janra_name
   FROM `movie`
   LEFT JOIN
     (SELECT mj.movie_id,
             janra.janra_name
      FROM movie_janra AS mj
      LEFT JOIN janra ON mj.janra_id=janra.id) AS f ON f.movie_id=movie.id) AS ll
LEFT JOIN
  (SELECT movie_nation.movie_id,
          nation.nation
   FROM movie_nation
   INNER JOIN nation ON nation.id=movie_nation.nation_id) AS rr ON rr.movie_id=ll.id

(объединение movie с результатом (movie_janra и janra)) КАК ll это дает мне все фильмы со всеми жанрами, как показано ниже

id name janra 
1   got  action
1   got  comedy

, затем я присоединяюсь к этому результату (присоединиться movie_nation с nation) AS rr ON rr.movie_id = ll.id

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

+-----------+-------------+-------------+----------+
|    id     |     name    |     janra   |  nation  |
+-----------+-------------+-------------+----------+
+-----------+-------------+-------------+----------+
|    1      |     got     |     action  |  us      |
+-----------+-------------+-------------+----------+
+-----------+-------------+-------------+----------+
|    1      |     got     |     action  |  uk      |
+-----------+-------------+-------------+----------+
+-----------+-------------+-------------+----------+
|    id     |     name    |     comedy  |  us      |
+-----------+-------------+-------------+----------+
+-----------+-------------+-------------+----------+
|    id     |     name    |     comedy  |  uk      |
+-----------+-------------+-------------+----------+

Я использую MySQL.

Этот результат больше, чем я хочу. Я хочу два ряда. Спасибо всем.

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Прежде всего, удалите таблицы movie_nation и movie_janra, затем просто переместите столбцы в таблицу mov ie, как показано ниже, и сохраните все остальные таблицы: Таблицы базы данных

4 : https://i.stack.imgur.com/Mf6MU.png

затем я добавил данные таблицы:
mov ie table
Таблица Джанры
Таблица наций

Затем используйте этот код для получения желаемого результата:

select a.id,a.movie_name,b.janra_name, c.nation_name
from movie a 
left outer join janra b
on a.janra_id = b.id
left outer join nation c
on a.nation_id = c.id;

Просто выберите Идентификатор и имя Mov ie для таблицы mov ie затем оставляют внешнее соединение с таблицей nation и janra, используя их соответствующие идентификаторы из таблицы mov ie, чтобы получить имена janra_name и nation_name.

Вот результат: запрос здесь

0 голосов
/ 03 марта 2020

на основании предыдущего ответа вам просто нужно изменить тип данных janra_id и nation_id с таблицы mov ie с int на varchar. теперь вы можете использовать несколько янр и нацию, используя значения, разделенные запятыми.

используйте этот новый код для достижения этого.

select a.id, a.movie_name, GROUP_CONCAT(distinct a.janra_name) janra_name, 
GROUP_CONCAT(distinct a.nation_name) nation_name
from (
select a.*,b.janra_name,c.nation_name
from movie a
left outer join janra b
on FIND_IN_SET(b.id, a.janra_id)
left outer join nation c
on FIND_IN_SET(c.id, a.nation_id)
order by a.movie_name ) a
group by a.movie_name;

Вот пример данных: enter image description here

И вот результат запроса: enter image description here

...