Получить все значения таблицы, если совпадение в 2 других таблицах существует - PullRequest
0 голосов
/ 16 января 2020

У меня есть таблица "канал".

channelId
a
b
c
d

таблица "видео"

videoId | channelId
1       | a
2       | b
3       | c
4       | e

таблица "комментарий"

commentID | videoID | videoID_channelID
xx        | 1       | a
yy        | 2       | b
zz        | 5       | e
tt        | 6       | f

Ключи есть :

  • channel.channelId = video.channelId = comment.videoID_channelID
  • video.videoId = comment.videoID

Мне нужно:

  • все каналы по крайней мере с 1 видео и 1 комментарием
  • все видео по крайней мере с 1 каналом и 1 комментарием
  • все комментарии с видео и каналом

Итак, я хочу сделать 3 SQL операторов, по одному для каждой таблицы, которая ссылается на другую 2.

Я пробовал это с двойным внутренним соединением (https://www.sqlitetutorial.net/sqlite-inner-join/ ) но, похоже, он возвращает все подходящие комбинации, а не:

channelId
a
b

videoId | channelId
1       | a
2       | b

commentID | videoID | videoID_channelID
xx        | 1       | a
yy        | 2       | b

Мой код пока что позволяет получить все каналы с хотя бы 1 видео и 1 комментарием:

SELECT
        channel.channelId
FROM
    channel
    INNER JOIN video ON video.channelId = channel.channelId
    INNER JOIN comment ON comment.videoID_channelID = video.channelId

1 Ответ

0 голосов
/ 16 января 2020

Вы можете получить все нужные результаты с помощью одного и того же запроса, объединяющего все 3 таблицы, но для каждого случая выберите разные столбцы:

SELECT c.channelId
FROM channel c
INNER JOIN video v ON v.channelId = c.channelId
INNER JOIN comment cm ON cm.videoID_channelID = v.channelId;

SELECT v.videoID, c.channelId
FROM channel c
INNER JOIN video v ON v.channelId = c.channelId
INNER JOIN comment cm ON cm.videoID_channelID = v.channelId;

SELECT cm.commentID, v.videoID, c.channelId
FROM channel c
INNER JOIN video v ON v.channelId = c.channelId
INNER JOIN comment cm ON cm.videoID_channelID = v.channelId;

Возможно, вам придется добавлять DISTINCT после каждого SELECT, если вы получить дубликаты в ваших реальных данных. Смотрите демо . Результаты:

| channelId |
| --------- |
| a         |
| b         |


| videoID | channelId |
| ------- | --------- |
| 1       | a         |
| 2       | b         |


| commentID | videoID | channelId |
| --------- | ------- | --------- |
| xx        | 1       | a         |
| yy        | 2       | b         |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...