MySQL В запросе, используя результаты другого запроса? - PullRequest
0 голосов
/ 16 октября 2011

Мне нужна помощь в создании запроса для моей базы данных mySQL.Недавно я начал использовать JOIN и IN для выбора строк в моей базе данных, поэтому я прошу прощения за то, что выглядело как нуб.

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

В моей базе данных пользователи "связаны", порядок НЕ важен.

Название таблицы: UserLinks

link_ID   User_1   User_2
1         10982*   34982
2         82738    16643
3         10982*   99822
4         78256    10982*

Пользователь, на которого я обращаю внимание, это пользователь 10982

1) Первая часть этого запроса, которую я хотел бы создать, находит идентификатор пользователей.что этот пользователь (10982) связан с.Этими пользователями являются пользователи 34982, 99822 и 78256. Я представляю, что это что-то столь же простое, как SELECT * FROM UserLinks WHERE User_1 OR User_2 = 10982, моя проблема здесь в том, как мне получить значения - учитывая, что я не могу просто выбрать строку для возврата (я рассмотрел использованиеесли оператор ... если значение User_1 равно 10982, то выберите User_2. Это, однако, кажется избыточным.

С этим списком идентификаторов пользователей я бы хотел выполнить вторую часть запроса, чтобы найти, какие Event_ID соответствуют этому списку пользователей (идентификаторы пользователей теперь UserEv_ID):

Имя таблицы: EventUserTags

ETag_ID   UserEv_ID   Event_ID
1         34982*      289
2         82738       231
3         99822*      990
4         78256*      486

2) Вторая частьэтот запрос будет использовать список, сгенерированный из первого запроса (идентификаторов пользователей), для создания списка идентификаторов Event_ID.Я знаю, что вы можете использовать оператор IN и просто вывести этот список в запрос в виде массива, но это означает преобразование результатов первой части запроса в массив.Это снова кажется излишним.Я хотел бы знать, как правильно выбрать эти Event_ID с использованием идентификаторов пользователя ... Я думаю, что запрос JOIN будет работать, но мне нужен совет, как его использовать.

ЗначенияEvent_ID, полученные здесь: 289, 990 и 486. В последней части этого запроса мне нужно использовать этот список Event_ID, сгенерированный из последнего запроса, чтобы сопоставить его с данными другой таблицы, моей таблицы Events.

Имя таблицы: События

Event_ID  Event_Order  
182         8728342    
289         3478792*    
990         1876623*     
486         9617789**     

3) Наконец, мне нужно использовать Event_ID, полученные из последнего запроса, чтобы получить их соответствующий Even_Order.Опять же, я знаю, что это можно сделать с помощью оператора IN (используя массив), но это не будет эффективным вообще.

Цель этого запроса - начать с одного идентификатора пользователя и найти Event_Order каждого пользователя, с которым связан этот пользователь.

Любая помощь действительно приветствуется

1 Ответ

1 голос
/ 16 октября 2011

Все это можно сделать довольно просто в одном запросе, который я напишу, а затем объясню:

SELECT
   Event_Order, -- I think this is the one you need, but selecting other fields anyway
   Event_ID,
   User_1,
   User_2
FROM
   Events
   NATURAL JOIN EventUserTags
   JOIN UserLinks ON (
      UserEv_ID = User_1 AND User_2 = 10982
      OR UserEv_ID = User_2 AND User_1 = 10982
   )

NATURAL JOIN - сокращение от JOIN EventUserTags ON (Events.Event_ID = EventUserTags.Event_ID).Это работает, потому что ключи, к которым вы присоединяетесь, имеют одинаковое имя.

Тогда вы присоединяетесь к соответствующим идентификаторам пользователей, только если в ссылке есть пользователь, которого вы ищете.

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