MySQL запрос, который возвращает результаты для 2 значений, если любой из них соответствует запросу - PullRequest
0 голосов
/ 07 апреля 2019

Я хотел бы запросить 2 таблицы для сопоставления значений и вернуть результаты, если либо условие соответствует.Вот таблицы, в которых показаны только соответствующие столбцы ...

scores
    scoreId int not null,
    comments varchar(128)

mediaComments
    contentId varchar(40) not null,
    scoreId int (foreign key to scores.scoreId)

Я хотел бы получить значения для комментариев и contentId для следующих критериев ...

comments! = ""ИЛИ contentId существует для ScoreId

Вот значения таблицы ...

mysql> select * from mediaComments;
+---------+-----------------------------+
| scoreId | contentId                   |
+---------+-----------------------------+
|       1 | CON-i6FYCiNDJ0u7mbGfttK8Joy |
|       2 | CON-RgNzMie5F8EdSnEq7122siV |
|       4 | CON-3bo1iGIBdu623TS4ltggytT |
|       6 | CON-qjMVn2THP6d2nCta9JWL1na |
+---------+-----------------------------+
4 rows in set (0.00 sec)

mysql> select scoreId, comments from scores;
+---------+---------------------------+
| scoreId | comments                  |
+---------+---------------------------+
|       1 |                           |
|       2 | ReadScoreCommentsMethods1 |
|       3 | ReadScoreCommentsMethods2 |
|       4 | ReadScoreCommentsMethods3 |
|       5 | ReadScoreCommentsMethods4 |
|       6 | ReadScoreCommentsMethods5 |
|       7 |                           |
|       8 |                           |
|       9 |                           |
+---------+---------------------------+
9 rows in set (0.00 sec)

Вот простой запрос, который я использую.

select
    s.scoreId,
    s.comments,
    m.contentId
from
    scores s,
    mediaComments m
where
    s.comments != '' or
    m.scoreId = s.scoreId;

Я пытаюсь получить результаты, если комментарии или mediaComments имеют значения.Если значения не совпадают с запросом, я хотел бы получить NULL.Например, я хотел бы, чтобы m.contentId возвращался как NULL, если s.scoreId не найден в mediaComments, но есть значение для s.comments.

Вот результаты, которые я получаю...

mysql> select
    ->     s.scoreId,
    ->     s.comments,
    ->     m.contentId
    -> from
    ->     scores s,
    ->     mediaComments m
    -> where
    ->     s.comments != '' or
    ->     m.scoreId = s.scoreId;
+---------+---------------------------+-----------------------------+
| scoreId | comments                  | contentId                   |
+---------+---------------------------+-----------------------------+
|       1 |                           | CON-i6FYCiNDJ0u7mbGfttK8Joy |
|       2 | ReadScoreCommentsMethods1 | CON-i6FYCiNDJ0u7mbGfttK8Joy |
|       2 | ReadScoreCommentsMethods1 | CON-RgNzMie5F8EdSnEq7122siV |
|       2 | ReadScoreCommentsMethods1 | CON-3bo1iGIBdu623TS4ltggytT |
|       2 | ReadScoreCommentsMethods1 | CON-qjMVn2THP6d2nCta9JWL1na |
|       3 | ReadScoreCommentsMethods2 | CON-i6FYCiNDJ0u7mbGfttK8Joy |
|       3 | ReadScoreCommentsMethods2 | CON-RgNzMie5F8EdSnEq7122siV |
|       3 | ReadScoreCommentsMethods2 | CON-3bo1iGIBdu623TS4ltggytT |
|       3 | ReadScoreCommentsMethods2 | CON-qjMVn2THP6d2nCta9JWL1na |
|       4 | ReadScoreCommentsMethods3 | CON-i6FYCiNDJ0u7mbGfttK8Joy |
|       4 | ReadScoreCommentsMethods3 | CON-RgNzMie5F8EdSnEq7122siV |
|       4 | ReadScoreCommentsMethods3 | CON-3bo1iGIBdu623TS4ltggytT |
|       4 | ReadScoreCommentsMethods3 | CON-qjMVn2THP6d2nCta9JWL1na |
|       5 | ReadScoreCommentsMethods4 | CON-i6FYCiNDJ0u7mbGfttK8Joy |
|       5 | ReadScoreCommentsMethods4 | CON-RgNzMie5F8EdSnEq7122siV |
|       5 | ReadScoreCommentsMethods4 | CON-3bo1iGIBdu623TS4ltggytT |
|       5 | ReadScoreCommentsMethods4 | CON-qjMVn2THP6d2nCta9JWL1na |
|       6 | ReadScoreCommentsMethods5 | CON-i6FYCiNDJ0u7mbGfttK8Joy |
|       6 | ReadScoreCommentsMethods5 | CON-RgNzMie5F8EdSnEq7122siV |
|       6 | ReadScoreCommentsMethods5 | CON-3bo1iGIBdu623TS4ltggytT |
|       6 | ReadScoreCommentsMethods5 | CON-qjMVn2THP6d2nCta9JWL1na |
+---------+---------------------------+-----------------------------+
21 rows in set (0.00 sec)

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Не очень понятно, о чем вы просите. Тем не менее, вы, вероятно, должны использовать OUTER JOIN. FULL OUTER JOIN возвращает все из обеих таблиц, независимо от того, является ли оно нулевым или нет.

SELECT
    s.scoreId,
    s.comments,
    m.contentId
FROM
    scores as s 
    FULL OUTER JOIN mediaComments as m 
    ON s.scoreID = m.contentId;
```mysql
0 голосов
/ 07 апреля 2019

Это то, что вы хотите?

select s.*
from scores s
where s.comment <> '' or
      exists (select 1
              from mediaComments mc
              where mc.scoreid = s.scoreid
             );

Если вы тоже хотите content_id, то примерно так:

select s.*, mc.contentid
from scores s left join
     mediaComments mc
     on mc.scoreid = s.scoreid
where s.comment <> null or mc.contentid is not null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...