MySQL JOIN запрос сбит - PullRequest
       2

MySQL JOIN запрос сбит

1 голос
/ 11 февраля 2012

Хорошо, я не лучший в JOIN'ах, и после всех этих лет работы с MySQL вы думаете, что я был бы сейчас как минимум минимально приличным.Полагаю, я никогда не работал над чем-то невероятно сложным, пока не стоит присоединиться к столу.Так что вот, я немного запутался, нуждаясь в полезном примере, чтобы привести меня в движение, что-то, что имеет отношение к моим фактическим данным, которые я могу придумывать или рассказывать, потому что все чтения, которые я делаю в Интернете, где-то просто даюту меня головные боли на данный момент.Я думаю, что, возможно, застрял в мифологии о том, что JOIN - трудная вещь, они не кажутся такими, но когда я пытался, я терпел неудачу.Так или иначе, я работаю с PHP в качестве серверного кодирования, и я верю, что MySQL 5.

Так что в некоторой степени это конструкция.

У меня есть таблица информация иТаблица Соединения .

Соединения имеет: member_id, connection_id, active

Информация имеет: firstname, lastname, gender, member_id

Я должен сказать, что таблицы содержат больше данных для каждой таблицы, но, насколько я понимаю, мне нужно написать запрос, чтобы я мог использовать member_id в качестве соединителя / внешнего ключа.Где я могу использовать обе стороны информации.Мне нужно знать, если active is 1, а затем мне нужно знать все вышеупомянутые столбцы для информации.

Я пытался

SELECT member_id, 
    connection_id, 
    active, 
    firstname, 
    lastname, 
    gender, 
    member_id 
FROM connections, information 
WHERE connection.member_id = information.member_id AND 
      connection.active = 1

, и я пытался

SELECT * FROM connections, information 
WHERE connection.member_id = information.member_id AND 
      connection.active = 1

С первым, который я получаю, member_id является амбициозным, что понятно до такой степени, которая, я думаю, является причиной совпадения столбцов между двумя таблицами.Тогда второй запрос меня не обслуживает, так как он работает только с одним человеком.

Моя конечная цель - найти все соединения для определенного member_id в таблице соединений, одновременно собирая всю информацию об этих соединениях из информационной таблицы, используя connection_id как то же самое, что и member_idв информационной таблице.

Итак, с точки зрения непрофессионалов, если я не имею смысла, скажем, я хотел перечислить всех моих друзей из БД.Моя таблица соединений позволяет мне узнать, с какими людьми я связан, где member_id - это мой идентификатор, а connection_id - это мои друзья, member_id в другой таблице.Надеюсь, это имеет больше смысла.И именно здесь у меня возникают проблемы с моим запросом, и я пытаюсь написать его правильно.Если бы я мог получить рабочий нормальный образец этого, я думаю, что я мог бы лучше понять, что JOIN's не помогает, что я также не могу выяснить, какой тип JOIN лучше всего подходит для моих нужд, я полагаю.

РЕДАКТИРОВАТЬ ....

Хорошо, согласно запросу из комментария ниже.Примерные данные ожидаемого вывода из таблиц, которые выглядят примерно так:

Таблица соединений

member_id, connection_id, active

1     |    2    |    1

1     |    3    |    1

1     |    4    |    1

1     |    5    |    1

2     |    1    |    1

2     |    5    |    1

3     |    1    |    1

Информационная таблица

member_id, firstname, lastname, gender, ...other unimportant rows for this query


1    | Chris    |   Something    |    m    | ....

2    | Tony     |   Something    |    m    | ....

3    | Brandon  |   Something    |    m    | ....

4    | Cassie   |   Something    |    f    | ....

5    | Jeff     |   Something    |    m    | ....

6    | John     |   Something    |    m    | ....

теперь из таблицы соединений мне нужно собрать все идентификаторы соединения, связанные с моим member_id, где active равен 1, затем из информационной таблицы собрать всех имя, фамилию, пол .. Теперь я знаю, что могу сделать этот 2 шаг, где я объединяю всеАргументы connection_id из соединений затем запускают их через какой-то цикл, и один за другим получают итоговые идентификаторы из первого запроса, но мне это кажется немного неясным и интенсивным процессом, которого я хочу избежать, что приводит меня сюда .. В настоящее время из моегоисходный запрос, опубликованный для многих пользователей, которые до сих пор делятся, пытаясь помочь моим результатам, дает

1    |   Chris   |    Something    |    m    |    2    


1    |   Chris   |    Something    |    m    |    3    


1    |   Chris   |    Something    |    m    |    4    


1    |   Chris   |    Something    |    m    |    5 

то, что я хотел бы увидеть, это что-то вроде

2    |   Tony     |    Something    |    m    


3    |   Brandon  |    Something    |    m  


4    |   Cassie   |    Something    |    f   


5    |   Jeff     |    Something    |    m 

После просмотрапри этом я полагаю, что мне также нужно знать столбец friendID, который совпадает с моим member_id, но это что-товыяснить после этого начального препятствия

Ответы [ 5 ]

1 голос
/ 11 февраля 2012

Ошибка в вашем WHERE предложении, потому что вместо Connections вы написали Connection, после чего сервер генерирует ошибку.

...
WHERE connection.member_id = information.member_id AND 
      connection.active = 1

попробуйте это:

SELECT a.Member_ID, 
       a.FirstName, 
       a.LastName, a.gender,
       b.Connection_ID
FROM Information a INNER JOIN Connections b
        on a.Member_ID = b.Member_ID
WHERE b.`Active` = 1 

ОБНОВЛЕНИЕ

в таком случае у вас, скорее всего, будет SELF JOIN

SELECT DISTINCT b.Connection_ID,
       c.*
FROM Information a INNER JOIN Connections b ON
        a.Member_ID = b.Member_ID
     INNER JOIN Information c ON
        b.Connection_ID = c.Member_ID
WHERE b.`Active` = 1
      AND a.Member_ID = 'ID HERE' -- If you want to get for specific member
0 голосов
/ 11 февраля 2012

Вы присоединяетесь не к тем столам. Вы сказали:

где member_id - мой идентификатор, а connection_id - мои друзья member_id в другой таблице

Тогда вы должны сопоставить соединения .connection_id с information.member_id. Самое простое решение:

select c.member_id, c.connection_id, c.active from connections c
join information i on c.connection_id = i.member_id
where c.active = 1 and c.member_id = @yourId

Вот и все:)

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

Попробуйте изменить на:

SELECT * FROM connections c JOIN information i ON i.member_id = c.member_id WHERE c.active = 1
0 голосов
/ 11 февраля 2012

Попробуйте это:

SELECT *
FROM information
    LEFT OUTER JOIN connections
    ON information.member_id = connections.member_id
WHERE connections.active = 1;
0 голосов
/ 11 февраля 2012

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

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

Например,

SELECT connections.member_id, connection_id, active, firstname, lastname, gender, information.member_id FROM connections, information WHERE connections.member_id = information.member_id AND connections.active = 1

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

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