SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.01.2013 17:26:42

treamz
Участник
Зарегистрирован: 03.10.2012
Сообщений: 5

Соединить три таблицы

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

Есть три таблицы:
1. view (отвечает за добавление просмотров профиля)
id | id_current | id_view | datetime (ID, ID юзера, ID посмотревшего профиль, время)
1 | 1 | 2 | 2013-01-31 10:21:49

2. contact (таблица с данными юзера - изменять структуру таблицы нельзя)
id | name | birthday | photo
1 | admin | 1980-05-05

3. contact_data (дополнительная таблица с доп. параметрами пользователя, которые он добавил)
id | contact_id | field | value (ID, ID юзера, field название параметра, value сам параметр)
1  | 1 | url | http://ya.ru
2  | 1 | about | Вася
3  | 2 | url | http://ya.ru
4  | 2 | sex | m
5  | 2 | ... | ...
url - заполнен присутствует

В таблице №3 могут быть разные данные field в зависимости от того, какие поля заполнил юзер, может вообще ничего не заполнить (кроме URL).

Использую JOIN LEFT

SELECT
v.id_current, v.id_view, v.datetime, c.name,c.birthday,c.photo, d.value as url
FROM view v
LEFT JOIN contact c ON v.id_view = c.id
LEFT JOIN contact_data d ON c.id = d.contact_id
WHERE (v.id_current = $id_current AND d.field = 'url')
ORDER BY datetime desc
LIMIT 0,30


Все окей, выборка происходит, все как надо.

Далее мне надо присоединить еще два поля - sex, about

Вот тут и затык, при добавлении еще одного LEFT JOIN и условия WHERE ... AND e.field = 'sex' соответсвено подцепляется только 1 контакт у кого есть есть это поле. Подскажите как составить запрос, что бы все эти поля (которые в contact_data относятся к юзеру) в итоге сформировались вне зависимости от того, есть ли это поле у другого пользователя или нет, например, если его нет то просто присваивать NULL или еще чтото.

Заранее благодарен!

Отредактированно treamz (31.01.2013 17:28:56)

Неактивен

 

#2 31.01.2013 18:22:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Соединить три таблицы

1. Зачем таблицам view и contact_data поле id?

2. По вашему вопросу - вы сначала делаете join, а потом говорите отдать только те строки, у которых AND e.field = 'sex' - результат закономерный. Нужно сначала выбрать из таблицы contact_data те строки у которых e.field = 'sex', а потом джоинить. Например, с помощью подзапроса или поместив условие в части ON.

3. Чтобы не делать кучу left join, можно подзапросом с группировкой выбрать нужные данные из таблицы contact_data и сделать один раз left join.

Неактивен

 

#3 31.01.2013 18:29:21

treamz
Участник
Зарегистрирован: 03.10.2012
Сообщений: 5

Re: Соединить три таблицы

1. кстати да, он тут не нужен
2-3 Vasya не могли бы подсказать синтаксис

Спасибо

Неактивен

 

#4 31.01.2013 18:38:55

treamz
Участник
Зарегистрирован: 03.10.2012
Сообщений: 5

Re: Соединить три таблицы

Синтаксис нашел
LEFT JOIN wa_contact_data e ON (v.id_view = e.contact_id AND e.field = 'sex')

Подскажите как упростить и не использовть 5 JOIN одной таблицы, спасибо!

Неактивен

 

#5 31.01.2013 19:55:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Соединить три таблицы

что-то типа
..left join (select contact_id, group_concat(concat('параметр ', field, ' значение ',  value)) from contact_data group by 1) t ON ..
Но в этом случае параметры и их значения будут в одном поле.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson