2015-10-07 4 views
1

У меня есть база данных MySQL Контакты с тремя таблицами.Выбор строк на основе массива значений и данных объединения

  1. человек
  2. personContact
  3. personDetails

Каждый контакт акций первичный ключ называется 'ID'

Таблица personContact содержит значение, называемое 'personZip', который это почтовый индекс почтового адреса.

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

Я написал простое заявление, чтобы выполнить внутреннее соединение на 2 таблиц:

SELECT * FROM `personContact` 
INNER JOIN person 
ON personContact.ID=person.ID 

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

SELECT * FROM 'personContact' 
WHERE personContact.personZip=12564 
OR personContact.personZip=12563 
OR personContact.personZip=12522 
OR personContact.personZip=12590 
OR personContact.personZip=12594 
OR personContact.personZip=12533 
OR personContact.personZip=12570 
OR personContact.personZip=12589 
OR personContact.personZip=10509 

Я не уверен, как выполнить два объединения, чтобы объединить все столбцы из всех трех таблиц.

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

Ошибки MySQL не помогают мне двигаться в правильном направлении.

+1

Почему бы не использовать предложение 'IN' вместо этого? – RubahMalam

+0

Я отправил именно то, что вы просили с самого начала. Вы даже пробовали? – Morpheus

+0

@dbagley теперь делает снимок. Благодарю. –

ответ

1

Соединяет все три таблицы и вернуть все столбцы при фильтрации по почтовому индексу:

SELECT person.*, personContact.*, personDetails.* 
FROM person 
INNER JOIN personContact ON personContact.ID = person.ID 
INNER JOIN personDetails ON personDetails.ID = person.ID 
WHERE personContact.personZip = 12564 
    OR personContact.personZip = 12563 
    OR personContact.personZip = 12522 
    OR personContact.personZip = 12590 
    OR personContact.personZip = 12594 
    OR personContact.personZip = 12533 
    OR personContact.personZip = 12570 
    OR personContact.personZip = 12589 
    OR personContact.personZip = 10509 

EDIT: множественные OR заявления могут быть заменены использованием IN, как другие предложили

WHERE personContact.personZip IN (12564, 12563, 12522, 12590 ...)

+0

Использование 'IN' было бы более эффективным в этом случае. 'select *' будет возвращать все объединенные таблицы, не описывая их один за другим. – RubahMalam

+0

Я бы, вероятно, тоже написал таблицы, но я оставил его в формате, представленном в вопросе. – Morpheus

+0

Любая конкретная причина, по которой этот запрос занимает очень много времени? –

2

Вы были почти там. Используйте in, что эквивалентно or.

SELECT pc.* --select columns from the other tables as needed. 
FROM 
`personContact` pc 
INNER JOIN person p ON pc.ID = p.ID 
INNER JOIN personDetails pd on pd.ID = p.ID 
where pc.personzip in (12563, 12522, 10509) -- add more zips as needed 
+0

'pc.zip' бросает неизвестную ошибку столбца. Не уверен, что такое .zip. –

+0

это должно быть 'personzip'. изменил запрос –

+0

Хотя это может сработать, я не уверен, что здесь происходит. шт. *. ... какой? –

Смежные вопросы