ПРИСОЕДИНЯЙТЕСЬ к 4 таблицам с meta_table - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть такая структура базы данных:

sites
id | name
1  | Site 1
2  | Site 2

locations
id | city
23 | Baltimore
24 | Annapolis

people
id | name
45 | John
46 | Sue

sites_meta
id | site_id | meta_name | meta_value
1  |    1    |   local   |     23
2  |    1    |   person  |     45
3  |    2    |   local   |     24
4  |    2    |   person  |     46

Итак, как вы можете видеть, сайт 1 (идентификатор 1) находится в Балтиморе и связан с Джоном, сайт 2 (идентификатор 2) находится в Аннаполисесвязанный с Сью.

Мне нужно выяснить умный SQL-оператор, который может вернуть

id |   name   | id |    city    | id | name
 1 |  Site 1  | 23 |  Baltimore | 45 | John
 2 |  Site 2  | 24 |  Annapolis | 46 | Sue

Я был бы очень признателен, если кто-нибудь может мне помочь.Я пробовал несколько комбинаций оператора select, но я продолжаю зацикливаться на использовании двух значений из таблицы sites_meta.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012
select
    s.id as siteId,
    s.name as siteName,
    max(l.id) as locationId,
    max(l.city) as city,
    max(p.id) as personId,
    max(p.name) as personName
from
    sites_meta sm
    join sites s on s.id = sm.site_id
    left join locations l on l.id = sm.meta_value and sm.meta_name = 'local'
    left join people p on p.id = sm.meta_value and sm.meta_name = 'person'
group by
    s.id,
    s.name

Вы, вероятно, можете себе представить, как этот вид "мета" таблицы может стать болью ... особенно, когда к ней добавляется больше элементов.рассмотрите возможность замены на две новые таблицы, sites_locations и sites_people.

0 голосов
/ 25 февраля 2012
SELECT
    s.id,s.name,l.id,l.city,p.id,p.name
FROM
    sites s
    INNER JOIN sites_meta sm1 ON s.id = sm1.site_id
    INNER JOIN sites_meta sm2 ON s.id = sm2.site_id
    INNER JOIN locations l ON sm1.meta_value = l.id AND sm1.meta_name = 'local' 
    INNER JOIN people p ON sm2.meta_value = p.id AND sm2.meta_name = 'person'
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...