SQL как выбрать из 2 таблиц и сопоставить их - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть таблица с именем users и таблица с именем events.Каждый пользователь устанавливает собственные предпочтительные «коды городов».

Каждому событию присваиваются некоторые коды городов, и эта информация сохраняется в таблице:

events_areas:
area_id BIGINT
event_id BIGINT

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

я думал о том же, что и events_areas, иdo: users_areas:

area_id BIGINT
user_id BIGINT

Но тогда я не знаю, как сопоставить их в утверждении select ...?

Спасибо

Ответы [ 5 ]

0 голосов
/ 29 февраля 2012

Полезно начать перечислять отношения между таблицами (объектами) на простом английском языке.Например:

  1. Пользователь принадлежит к коду города, а у кода города много пользователей.
  2. Событие происходит в коде города, а у кода города много событий.

Оба оператора описывают отношения «многие ко многим», поэтому вам нужны эти две таблицы (иногда называемые таблицы перекрестных ссылок ).

Запись этих операторов всегда помогаетчтобы понять проблему и задать вопросы об этом.Если предположить, что приведенные выше утверждения верны, то наличие этих двух таблиц users_areas и events_areas также является правильным.Чтобы построить оператор select, обратите внимание, что есть только один столбец, который объединяет обе таблицы: area_id (который, кстати, поместился бы в int, использование bigint - это огромный излишним, и я думаю, что то же самое относится к user_id и event_id).Таким образом, area_id - это столбец, который необходимо использовать для сопоставления их (правильный термин для присоединения к ним).

Вот ваш оператор выбора:

SELECT ea.event_id, ea.area_id, ua.user_id
FROM events_areas ea
    INNER JOIN user_areas ua ON ea.area_id = ua.area_id

Или, если у вас также есть таблица event и таблица user, что, вероятно, имеет место, мы расширяем selectвыглядеть так:

SELECT e.name, u.name
FROM events_areas ea
    INNER JOIN user_areas ua ON ea.area_id = ua.area_id
    INNER JOIN users u ON u.user_id = ua.user_id
    INNER JOIN events e ON e.event_id = ue.event_id
0 голосов
/ 29 февраля 2012

Хорошо, я изменил это на основании вашего комментария ...

Создать эти таблицы:

Table: user
id
name

Table: user_area
id
user_id
area_id

Table: event
id
name

Table: event_area
id
event_id
area_id

Table: area
id
area_code

Затем выполните этот запрос:

SELECT event.name FROM event, event_area WHERE event.id = event_area.event_id AND event_area.area_id IN (SELECT area_id FROM user_area WHERE user_id = <CURRENTUSERSID>)
0 голосов
/ 29 февраля 2012

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

SELECT u.*, e.*
FROM users u
JOIN users_areas ua
  ON u.id = ua.user_id
JOIN events_areas ea
  ON ea.area_id = ua.area_id
JOIN events e
  ON ea.event_id = e.id
0 голосов
/ 29 февраля 2012

Оператор select будет выглядеть примерно так:

SELECT DISTINCT users.*, events.*
FROM users
JOIN users_areas ON users.user_id = users_areas.user_id
JOIN events_areas ON users_areas.area_id = event_areas.area_id
JOIN events ON events_areas.event_id = events.event_id
0 голосов
/ 29 февраля 2012
SELECT *
    FROM users u
        INNER JOIN users_areas ua
            ON u.user_id = ua.user_id
        INNER JOIN events_areas ea
            ON ua.area_id = ea.area_id
        INNER JOIN events e
            ON ea.event_id = e.event_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...