SQL Join 2 таблицы, даже если нет соответствующих данных - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над объединением содержимого моих таблиц, я пытаюсь объединить две таблицы, все еще получая результаты из таблицы 'фильмы', даже если в таблице 'users_ratings' нет соответствующей записи.Но, похоже, не работает, я получаю только один результат.

- таблица фильмов (100 записей)

CREATE TABLE IF NOT EXISTS `movies` (
  `ID` int(20) NOT NULL,
  `title_name` vachar(255) NOT NULL,
  `creation_date` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

- таблица оценок (1 запись)

CREATE TABLE IF NOT EXISTS `users_ratings` (
  `ID` int(20) NOT NULL,
  `user_id` bigint(20) NOT NULL,
  `type_id` bigint(20) NOT NULL,
  `type_name` vachar(255) NOT NULL,
  `score` int(11) NOT NULL,
  `creation_date` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

- My Query

SELECT name_table.*, ur.type_id, count(ur.type_id) vote_count
FROM `movies` name_table 
left JOIN users_ratings ur ON name_table.id = ur.type_id
WHERE ur.type_name= 'movies'
GROUP BY ur.type_id
Order BY vote_count DESC

- Результаты запроса

ID    title_name  creation_date        type_id  vote_count
1     Avatar      2014-05-20 00:00:00  1        1

- Результаты, которые я пытаюсь получить (Должен ли я получить 100 записей)

ID    title_name      creation_date        type_id  vote_count
1     Avatar          2014-05-20 00:00:00  1        1
2     Avengers        2014-05-20 00:00:00  NULL     NULL
3     Ant-Man         2014-05-20 00:00:00  NULL     NULL
4     Jurassic World  2014-05-20 00:00:00  NULL     NULL
5     Rampage         2014-05-20 00:00:00  NULL     NULL
6     Black Panther   2014-05-20 00:00:00  NULL     NULL
7     Tombe Raider    2014-05-20 00:00:00  NULL     NULL
8     Deadpool        2014-05-20 00:00:00  NULL     NULL
9     Pacific Rim     2014-05-20 00:00:00  NULL     NULL

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

В дополнение к тому, что вы join ошибаетесь, я думаю, что group by тоже.

Я думаю, вы хотите:

SELECT m.*, MAX(ur.type_id), COUNT(ur.type_id) as vote_count
FROM movies m LEFT JOIN
     users_ratings ur
     ON m.id = ur.type_id AND ur.type_name= 'movies'
GROUP BY m.id
ORDER BY vote_count DESC;

В общем, используйте что-то вроде SELECT m.* в GROUP BY запрос будет неверным.Это единственный случай, когда это разрешено, потому что id уникален в таблице movies.

Обратите внимание, что type_id теперь имеет функцию агрегирования в SELECT.

0 голосов
/ 23 сентября 2018

Попробуйте: AND ( ur.type_name = 'movies' OR ur.type_name IS NULL).Будут показаны нулевые результаты.

SELECT name_table.*, ur.type_id, count(ur.type_id) vote_count
FROM `movies` name_table 
left JOIN users_ratings ur ON name_table.id = ur.type_id 
                    AND ( ur.type_name = 'movies' OR ur.type_name IS NULL)
GROUP BY name_table.id 
Order BY vote_count DESC;`  
0 голосов
/ 22 сентября 2018

С тех пор вы поставили явное условие Where, равное ur.type_name = movies, чтобы оно отфильтровывало результат после левого соединения.Вам необходимо перевести условие «Где» в соответствие LEFT JOIN ON.

Вместо этого попробуйте следующее:

SELECT name_table.*, ur.type_id, count(ur.type_id) vote_count
FROM `movies` name_table 
left JOIN users_ratings ur ON name_table.id = ur.type_id 
                              AND ur.type_name= 'movies'
GROUP BY name_table.id 
Order BY vote_count DESC

Примечание: Как указано @Strawberry, вам следует избегать использования подстановочных знаков (*) на основе Select;и получите только определенные столбцы, как того требует код вашего приложения.

Кроме того, вы можете прочитать Почему SELECT * считается вредоносным?

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