как объединить 3 реляционные таблицы - PullRequest
2 голосов
/ 23 декабря 2010

как объединить 3 реляционные таблицы со структурой:

t1 | id
t2 | id | rating
t3 | source_id | relation

t3 хранит данные поля, которые t1 и t2 используют обе.поэтому поле source_id может быть идентификатором t1 или идентификатором t2.

input  : t1 id
output : t2 rating

пример:

**t1**

id |
---------
42 |

**t2**

id | rating  
-------------
37 | 9.2

**t3**

id | source_id
--------------
42 | 1
37 | 1
26 | 2
23 | 1

я хочу получить 9.2 с 42 входами.

Вы можете сделать это одним SQL-запросом?

Ответы [ 3 ]

3 голосов
/ 25 декабря 2010

Вы "реляционные таблицы" - это катастрофа;требуемый код SQL (SQL предназначен для навигации по реляционным базам данных) будет еще более опасным, никогда не завершенным и не стабильным.Проблемы кодирования - это последующие проблемы второго порядка, которые выявляют ошибки в первом порядке.

Во-первых, нормализуйте и точно смоделируйте ваши данные для реляционной СУБД, в которую вы их поместили;и чтобы вы могли использовать реляционный язык SQL.Тогда код будет простым, легким, понятным и полным.

Если вы хотите, чтобы я смоделировал данные, хорошо.Но мне нужно больше информации, чем загадочных Id столбцов;Мне нужны имена сущностей и столбцов, что они означают, как они на самом деле связаны друг с другом.

Ответы на комментарии

Да, у вас наверняка может быть столбецэто внешний ключ, ссылающийся на несколько родительских таблиц.Но вы не можете (в реляционной базе данных) иметь столбец, который является или одной или другой родительской таблицей: это приведет к сиротам, спинстерам и всевозможным легко избежать ужасов кодирования.

2 голосов
/ 23 декабря 2010

Этот запрос даст вам желаемый результат для ваших данных, хотя не думаю, что он корректен в вашей модели:

SELECT  t2.rating
FROM    t1
JOIN    t3 t31
ON      t31.id = t1.id
JOIN    t3 t32
ON      t32.source_id = t31.source_id
JOIN    t2
ON      t2.id = t32.id
WHERE   t1.id = 42
1 голос
/ 23 декабря 2010

я нашел решение, что вы думаете?

SELECT t2.rating
FROM t3 AS t3
inner join t1 AS t1 on t1.id = t3.id
inner join (SELECT source_id, rating
FROM t3 AS t32
inner join t2 AS review on t2.id = t32.id) as second on second.source_id = t3.source_id
where t1.id = 42 limit 0,1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...