Объединить две таблицы в одну таблицу без использования объединения и без результата, создавая декартово произведение - PullRequest
0 голосов
/ 11 апреля 2020

Как мне составить таблицу результатов двух разных рейтингов, не создавая декартово произведение. распространение и хостинг - это два разных типа пользовательских рейтингов. Пользователи оценивают места, которые помечены с помощью spotId. userdiffrating и userhostrating связывают оценки пользователей с правильными точками. Я пытаюсь получить все оценки для определенного c места в таблице. Пример данных и ожидаемый результат приведены ниже.

Содержимое таблицы:

userdiffrating:

-------------------------------
| RatingId | userId  | spotId |
-------------------------------
| 1        | 1       | 1      |
-------------------------------
| 2        | 2       | 1      |
-------------------------------
| 3        | 1       | 2      |
-------------------------------

diffrating:

----------------------
| RatingId | userId  |
----------------------
| 1        | 5       |
----------------------
| 2        | 2       | 
----------------------
| 3        | 4       |
----------------------

userhostrating:

-------------------------------
| RatingId | userId  | spotId |
-------------------------------
| 1        | 1       | 1      |
-------------------------------
| 2        | 2       | 1      |
-------------------------------
| 3        | 1       | 1      |
-------------------------------

хостинг:

----------------------
| RatingId | userId  |
----------------------
| 1        | 1       |
----------------------
| 2        | 3       | 
----------------------
| 3        | 4       |
----------------------

Это то, что я изначально пробовал, но это создает декартово произведение:

SELECT D.rating diffrating, H.rating hostrating FROM diffrating D 
JOIN userdiffrating UD ON D.ratingId = UD.ratingId 
JOIN userhostrating UH ON UD.spotId = UH.spotId 
JOIN hostrating H ON UH.ratingId = H.ratingId WHERE UD.spotId = 1

Результат первого запроса (декартово произведение):

-------------------------
| diffrating| hostrating|
-------------------------
| 5         | 1         |
-------------------------
| 5         | 3         | 
-------------------------
| 5         | 4         |
-------------------------
| 2         | 1         |
-------------------------
| 2         | 3         | 
-------------------------
| 2         | 4         |
-------------------------

Я пробовал следующий запрос, но не могу использовать оператор выбора, который содержит более одной строки в качестве подзапроса:

SELECT  D.rating AS diffrating, H.rating AS hostrating

FROM  diffrating D, hostrating H

WHERE D.ratingId = (SELECT ratingId FROM userdiffrating UD WHERE UD.spotId = 1) 

AND H.ratingId = (SELECT ratingId FROM userhostrating UH WHERE UH.spotId = 1)

Это ожидаемый результат (все различия и оценки хоста) для spotId = 1):

-------------------------
| diffrating| hostrating|
-------------------------
| 5         | 1         |
-------------------------
| 2         | 3         | 
-------------------------
| NULL      | 4         |
-------------------------

Это база данных: database layout

Возможно ли это и как это сделать? Спасибо

1 Ответ

0 голосов
/ 11 апреля 2020

Я думаю, что вы пытаетесь закодировать это

SELECT dr.rating diffratingval, hr.rating hostratingval
FROM diffrating dr
JOIN userdiffrating udr
    ON dr.ratingid = udr.ratingid
JOIN userhostrating uhr
    ON udr.spotid = uhr.spotid
JOIN hostrating hr
    ON uhr.ratingid = hr.ratingid
        AND dr.ratingid = hr.ratingid
WHERE udr.spotid = 60;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...