запрос на присоединение к MySQL - PullRequest
1 голос
/ 22 июня 2011

У меня есть две таблицы, к которым мне нужно присоединиться. Это:

  • art

    id | art
    --------
    1  | A
    2  | B
    3  | C
    4  | D
    5  | E
    6  | F
    7  | G
    8  | H
    9  | I
    

    и

  • Sess

    artid | sessid
    --------------
    1     | 1
    2     | 1
    3     | 1
    4     | 1
    1     | 2
    4     | 2
    5     | 2
    6     | 2
    1     | 3
    2     | 3
    7     | 3
    4     | 3
    

, где Sess.artid - это ключевой ключ для art.id.

Из приведенных выше таблиц видно, что есть 3 сеанса: A,B,C,D, A,D,E,F и A,B,G,D. Я хочу получить рейтинг искусств, которые происходят вместе с искусством A. Что-то вроде:

D=3
B=2

Как я мог сформировать такой запрос в mysql или postgres?

Ответы [ 4 ]

2 голосов
/ 22 июня 2011

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

SELECT aSameSession.art, count(*)
FROM art a
    INNER JOIN Sess s
        ON a.id = s.artid
    INNER JOIN Sess sSameArticle
            ON sSameArticle.sessid = s.sessid
    INNER JOIN art aSameSession
        ON sSameArticle.artid = aSameSession.id
WHERE A.art = 'A'
AND aSameSession.art <> 'A'
GROUP BY aSameSession.art

Выход:

B   2
C   1
D   3
E   1
F   1
G   1

Эта версия может быть немного трудна для понимания, поэтому здесь версия только с идентификатором статьи, которая намного проще:

SELECT sSameArticle.artid, count(*)
FROM Sess s
    INNER JOIN Sess sSameArticle
        ON sSameArticle.sessid = s.sessid
WHERE s.artid = 1
AND sSameArticle.artid != 1
GROUP BY sSameArticle.artid

Выход:

2   2
3   1
4   3
5   1
6   1
7   1

Добавление названия статьи просто косметическое.

2 голосов
/ 22 июня 2011

Примерно так, возможно:

select art,count(*)
from sessid
  left join art on art.id=artid
where sessid in (select sessid from sess where artid=1)
group by artid;

?

0 голосов
/ 22 июня 2011

Пример структуры таблицы и запросов на соединение в PostgreSQL

CREATE TABLE arts (
    arts_id serial PRIMARY KEY,
    name text NOT NULL
);

CREATE TABLE sessions (
    sessions_id integer NOT NULL,
    arts_id integer NOT NULL REFERENCES arts
);


SELECT arts.name, count(sessions_id)
FROM arts
JOIN sessions USING (arts_id)
GROUP BY arts.name
ORDER BY count(sessions_id) DESC;
0 голосов
/ 22 июня 2011
SELECT a.art, count(*) as ranking
FROM art a, sess s
WHERE a.id = s.artid
group by a.art
order by count(*) DESC;

Для утверждения в синтаксисе ANSI-92 взгляните на ответ Конерака.

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