2012-03-17 2 views
0

Не знаете, как это работает, но я нашел способ, который работает, хотя некоторые из столбцов содержат неверные данные. Так что пока, я оставлю это с указанием SOLVED, но мне может понадобиться эта документация для другой помощи. Однако он может быть удален.Собственные соединения для нескольких таблиц/левого соединения +

Извините, но я не думаю, что ответ кроется в «вопросах с похожими названиями». Я мог ошибаться, но я искал и искал документацию, которую я могу понять, но, вероятно, это похоже на мои старые времена с руководствами IBM для основных кадров. Если вы не знаете точного слова, вы не найдете ответа.

Так вот:

SELECT * FROM membership LEFT JOIN address2 USING(memno) 
CROSS JOIN contact USING(memno) 
CROSS JOIN workers USING(memno) 
CROSS JOIN comments USING(memno) 
JOIN candidates USING(memno) 

Пробовал это несколько способов. Я думал о том, что я пробовал все это, но, по крайней мере, я, по-видимому, не сделал этого по-другому. Когда я делаю только первую строку, я получаю все правильные столбцы, и я получаю все пять строк таблиц в моем db.

Когда я добавляю вторую строку, она работает, но я получаю только две строки. Он работает через строку «комментарии». Он не делает последнюю строку «кандидаты».

Что мне нужно, чтобы получить все пять строк (количество строк в таблице членства).

Cross join - одна проблема. Я думаю, что он ограничивает строки, так как в одной из таблиц есть только две строки, и они ограничиваются двумя способами.

Поэтому я считаю, что мне нужна правильная ВСТУПЛЕНИЕ для второй, третьей и четвертой строк и, вероятно, другой тип JOIN для последней строки.

У меня очень ограниченные волосы, чтобы вырваться, поэтому мне нужна ваша помощь.

ответ

1

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

SELECT * FROM membership 
LEFT JOIN address2 USING(memno) 
LEFT JOIN contact USING(memno) 
LEFT JOIN workers USING(memno) 
LEFT JOIN comments USING(memno) 
LEFT JOIN candidates USING(memno) 

Edit:

Лично я не стал бы доверять USING при использовании цепные левые соединения подобны этому. Я хотел бы убедиться, явно добавляя таблицу, чтобы присоединиться:

SELECT * FROM membership m 
LEFT JOIN address2 a on m.memno = a.memno 
LEFT JOIN contact con on m.memno = con.memno 
LEFT JOIN workers w on m.memno = w.memno 
LEFT JOIN comments com on m.memno = com.memno 
LEFT JOIN candidates can on m.memno = can.memno 

Я сканируетсяdocumentation на USING и не смогли найти никаких ссылок на это, но я имел в виду, что я не уверен, из какой таблицы ее выбирает столбцы. Это:

SELECT * FROM membership m 
LEFT JOIN address2 a on m.memno = a.memno 
LEFT JOIN contact con on m.memno = con.memno 

Является ли с помощью псевдонима m как левая часть соединения слева, поэтому я уверен, что я буду видеть все член Ассоциации, независимо от того, что Того есть или нет контакта или адрес. Тем не менее, это:

SELECT * FROM membership m 
LEFT JOIN address2 a USING(memno) 
LEFT JOIN contact c USING(memno) 

Не ясно, что из таблицы с помощью memno при соединении с contact. В первом левом соединении предыдущего примера нет другой таблицы, чтобы выбрать, чтобы она присоединилась к m, а a и m - левая часть.Но при присоединении c у вас будет 2 memno: m.memno и a.memno. Если USING выбирает m, то запрос будет таким же, но если он выбирает c, предыдущий запрос будет перевести:

SELECT * FROM membership m 
LEFT JOIN address2 a on m.memno = a.memno 
LEFT JOIN contact c on a.memno = c.memno 

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

+1

Членство в основной таблице. Остальные только для переменных данных, которые могут быть или не быть там для индивидуума. Зависит от того, что вводит пользователь. То, что я здесь делал, - это посмотреть, как выглядели таблицы и посмотреть, правильно ли они соединяются. Я думал, что попробовал, что ты должен здесь, но я, должно быть, испортил это. Я скопировал это, и я повторю свой тест. Спасибо за это. Я буду обновляться в ближайшие пару дней. – oldmanvette

+0

Я не знаю, подходит ли это для обсуждения на этом форуме, но здесь. Поправьте меня, если это не так, пожалуйста. Мне понравилась идея метода USING, потому что она выглядела более чистой, но это было тогда, когда я думал, что мне не нужно повторять ее для каждого ОБЪЕДИНЕНИЯ. Я должен попробовать этот явный метод после того, как закончу это. – oldmanvette

+0

Прежде чем я спросил вас, как делать то, что мне нужно было сделать, я много искал и читал. Для новичков, с которыми я столкнулся mysql и php, я думаю, что официальное руководство mysql слишком технично. Многие из нас только хотят «добиться успеха» как можно быстрее и эффективнее. Люди на этом форуме в основном говорят на простом английском языке, что очень помогает «новичкам». Я выполнил свой запрос с помощью прямых ссылок, как вы предложили, и он отлично работал. – oldmanvette

0

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

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

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

Второй случай можно разделить на два подсерия в зависимости от того, ограничено ли количество подробных записей максимум 1 или нет, но это не влияет на тип используемого соединения.

+0

Определенно хочу, чтобы левое соединение. Проблема заключалась в добавлении различных таблиц. Я собираюсь попробовать код Мостачо Моста. Я получил его для работы с помощью Ons, но мне нравится «ИСПОЛЬЗОВАТЬ» лучше, если он действительно работает. Наверное, нужно быть осторожным с моей клавиатурой. Спасибо за вашу помощь. – oldmanvette