MySQL помогите разобраться с множественным INNER JOIN
От: rebuy  
Дата: 16.11.14 11:19
Оценка:
MySQL помогите разобраться с множественным INNER JOIN:
Структура БД и схема запроса:





SELECT
    identities_contact.`name` AS `ФИО`,
    identities_contacttype.`name` AS `Тип`,
    identities_contactfield.label AS `Параметр`,
    identities_contactvalue.`value` AS `Значение`
FROM
    identities_contact
INNER JOIN identities_contacttype ON identities_contacttype.object_ptr_id = identities_contact.contact_type_id
INNER JOIN identities_contacttype_fields ON identities_contacttype.object_ptr_id = identities_contacttype_fields.contacttype_id
INNER JOIN identities_contactfield ON identities_contactfield.object_ptr_id = identities_contacttype_fields.contactfield_id
INNER JOIN identities_contactvalue ON identities_contact.object_ptr_id = identities_contactvalue.contact_id
WHERE
    identities_contact.related_user_id IS NULL
GROUP BY identities_contactvalue.`value`

Возвращает:
Company    Company    Address    
Ольга Тадеушевна Павловская    Person    Address    +37544111111
Евгений Трошкин    Person    Address    +3754434445554
Иванов Иван Иванович    Person    Address    +3754411111111
Евгений Трошкин    Person    Address    jjoloka@gmail.com
Иванов Иван Иванович    Person    Address    В. Гостинец, 100
Ольга Тадеушевна Павловская    Person    Address    ул. В. Гостинец
Евгений Трошкин    Person    Address    ул. Малинина 7

Должно возвращать:
Company    Company    Address    
Ольга Тадеушевна Павловская    Person    Phone +37544111111
Евгений Трошкин    Person    Phone +3754434445554
Иванов Иван Иванович    Person    Phone    +375445866777
Евгений Трошкин    Person    Mail    jjoloka@gmail.com
Иванов Иван Иванович    Person    Address    В. Гостинец, 124,26
Ольга Тадеушевна Павловская    Person    Address    ул. В. Гостинец
Евгений Трошкин    Person    Address    ул. Малинина 7



Тестовые данные для таблиц:
identities_contact:
24    21    Company        1
78    23    Иванов        Null

identities_contactvalue:
11    16    78    ул.Мира 1 
18    18    78    123456789

identities_contactfield:
16    phone    АДРЕС    phone    0    
18    phone    ТЕЛЕФОН    phone    0

identities_contacttype:    
23    Person    person    персональный

identities_contacttype_fields: (таблица для связывания групп полей и типов контактов)
9    22    19
10    23    16
11    23    17
12    23    18
13    23    19
14    23    20
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re: MySQL помогите разобраться с множественным INNER JOIN
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.11.14 07:13
Оценка:
Здравствуйте, rebuy, Вы писали:


R>
R>SELECT
R>    identities_contact.`name` AS `ФИО`,
R>    identities_contacttype.`name` AS `Тип`,
R>    identities_contactfield.label AS `Параметр`,
R>    identities_contactvalue.`value` AS `Значение`
R>FROM
R>    identities_contact
R>INNER JOIN identities_contacttype ON identities_contacttype.object_ptr_id = identities_contact.contact_type_id
R>INNER JOIN identities_contacttype_fields ON identities_contacttype.object_ptr_id = identities_contacttype_fields.contacttype_id
R>INNER JOIN identities_contactfield ON identities_contactfield.object_ptr_id = identities_contacttype_fields.contactfield_id
R>INNER JOIN identities_contactvalue ON identities_contact.object_ptr_id = identities_contactvalue.contact_id
R>WHERE
R>    identities_contact.related_user_id IS NULL
R>GROUP BY identities_contactvalue.`value`
1. У вас лишний group by. Откуда он взялся? У вас в запросе нет ни одной агрегатной функции.
2. У вас нет джойна между identities_contactvalue и identities_contactfield - как же вы значения привяжете к полям? 
Вроде бы, запрос должен быть таким:
[sql]
ELECT
    identities_contact.`name` AS `ФИО`,
    identities_contacttype.`name` AS `Тип`,
    identities_contactfield.label AS `Параметр`,
    identities_contactvalue.`value` AS `Значение`
FROM
    identities_contact
INNER JOIN identities_contacttype ON identities_contacttype.object_ptr_id = identities_contact.contact_type_id
INNER JOIN identities_contacttype_fields ON identities_contacttype.object_ptr_id = identities_contacttype_fields.contacttype_id
INNER JOIN identities_contactfield ON identities_contactfield.object_ptr_id = identities_contacttype_fields.contactfield_id
INNER JOIN identities_contactvalue ON identities_contact.object_ptr_id = identities_contactvalue.contact_id and identities_contactvalue.field_id = identities_contactfield.object_ptr_id
WHERE
    identities_contact.related_user_id IS NULL

Вообще, identities_contacttype_fields джойнить не обязательно — если данные соответствуют схеме, то в identities_contactvalue и так не будет "лишних" данных:
ELECT
    identities_contact.`name` AS `ФИО`,
    identities_contacttype.`name` AS `Тип`,
    identities_contactfield.label AS `Параметр`,
    identities_contactvalue.`value` AS `Значение`
FROM
    identities_contact
INNER JOIN identities_contacttype ON identities_contacttype.object_ptr_id = identities_contact.contact_type_id
INNER JOIN identities_contactvalue ON identities_contact.object_ptr_id = identities_contactvalue.contact_id 
INNER JOIN identities_contactfield ON and identities_contactvalue.field_id = identities_contactfield.object_ptr_id
WHERE
    identities_contact.related_user_id IS NULL
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.