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...
Пока на собственное сообщение не было ответов, его можно удалить.