2012-02-11 3 views
1

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

Таким образом, конструкция цели до некоторой степени.

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

Connections имеет: 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 в информационное табло.

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

EDIT ....

Ok согласно запросу от комментариев ниже.Выборочные данные Ожидаемый вывод из таблиц, которые выглядят примерно так:

Connections Таблица

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 | .... 

Теперь из таблицы соединений, мне нужно собрать все connection_id годов связанный с my member_id, где активным является 1, затем из информационной таблицы собирают все имя, фамилию, пол. Теперь я знаю, что могу сделать это s 2 step, где я объединяю все соединения 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, но это то, что нужно после этого начального барьера

ответ

1

Ошибка в вашем 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 

UPDATE

, если это так, то вы, скорее всего, имеют 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

Прежде всего, я должен взломать для своих орфографических ошибок, я не копировал и не вставлял свою концепцию, я просто набрал ее быстро, и ее поздно, так что масло горит низко. Так или иначе. Мой запрос и почти все, показанные здесь, работают над тем, чтобы получить правильное количество результатов, но то, что я пытаюсь сделать, это вернуть информацию друзей firstname, lastname и т. Д. В настоящее время я получаю от моего запроса и этого один и другие здесь, мое имя 8 раз с friendID, которое до некоторой степени является кошерным – chris

+0

, но я бы предпочел, чтобы у меня была информация о друзьях, основанная на connection_id, которая связана с моим member_id – chris

+1

@chris Можете ли вы опубликовать фиктивные записи для таблицы Connections and Information и ваш желаемый результат? Благодарю. Это очень поможет. –

0

Ошибка в первом случае является «неоднозначной», не амбициозной. Неоднозначное означает, что механизм 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 

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

+0

Не понимаю, что неправильно, что его поздно .. Что касается одного я должен был быть специфичны. Я получаю надлежащее количество возвращенных результатов, однако результаты для только одного конкретного человека, который будет моей информацией в этом случае, а не информацией друзей. Не уверен, что это вполне возможно. – chris

+0

@chris это говорит о том, что только 1 запись активна как 1. Я не знаю, почему вы используете это в своем предложении where. я не думаю, что ты это делаешь. Я думаю, что вы хотите что-то еще, и я думаю, что это может быть connection_id –

+0

Информация SELECT. * FROM информация, соединения WHERE information.member_id = connections.member_id И connections.connection_id = 1 –

0

Try изменения в:

SELECT * FROM connections c JOIN information i ON i.member_id = c.member_id WHERE c.active = 1 
0

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

SELECT * 
FROM information 
    LEFT OUTER JOIN connections 
    ON information.member_id = connections.member_id 
WHERE connections.active = 1; 
+0

Очень маловероятно, что он хочет присоединиться к LEFT. Это приведет к возврату результатов, даже если идентификатор соединительных таблиц не найден, и все столбцы для него будут равны нулю. – Timeout

+0

Почему мой пост получит «-1», что не имеет никакого смысла, поскольку ответ, который я дал, был практически таким же, как и другие, минус псевдонимы –

+0

ПРАВИЛЬНО, ВЛЕВО, ПЕРЕКРЕСТНО, ВНУТРЕННЕЕ, ВНЕШНИЕ ИТОГИ ... OP должен выяснить, какой из них ему нужно использовать. Соединение, которое используется больше всего, это JOIN, или LEFT OUTER JOIN ime –

0

Вы соединяющую на неправильно столы.Вы сказали:

где member_id мой идентификатор и connection_id мои друзья member_id на другой стол

Тогда, что вы должны соответствовать как connections.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 

Это все :)