Условные запросы среди нескольких таблиц - PullRequest
0 голосов
/ 11 февраля 2011

Привет и спасибо за просмотр моего вопроса, я надеюсь, что вы можете дать некоторое представление или направление.

У меня есть три таблицы (в основном): 'value_meta', 'value' и 'values_visibility'.Схема следующая:

TABLE 'value_meta'

COMMENT: contains a list of different values, each referencing a different 'value' table

int id PK

tinyint value1 FK to value1.value

tinyint value2 FK to value2.value

tinyint value3 FK to value3.value

...



TABLE 'value'

COMMENT:  there are different value tables (for example, if it were for user profile data, there would be a value table for "occupation", "body type", and/or "education level"

tinyint id PK

varchar(255) value



TABLE 'value_visibility'

COMMENT:  one value visibility entry per value[n] in the 'value_meta' table, each a boolean value.  If 1, the coding query will return the value as rerefenced in 'value[n]' table.  if 0, return null
int id PK

BOOLEAN 'value1_visibility'

BOOLEAN 'value2_visibility'

BOOLEAN 'value3_visibility'

....

Что я хочу сделать, это создать правильный запрос MySQL для проверки "для каждого" значения "в" value_meta ", если соответствующая запись значения в" value_visibility "равна 1, отображаемое значениеvarchar. еще вернуть ноль ".По сути, я хочу сделать его максимально эффективным (заброшенные таблицы и сопоставленные подзапросы, правильные условные выражения и использование функций ... Я слышал, что ISNULL плох).

Раньше я был хорош в построении запросов прямо из моегоНе забывайте возвращаться в колледж, но после нескольких лет неиспользования я стал на три соломинки без полноценной метлы.Может кто-нибудь мне помочь?Спасибо!

1 Ответ

0 голосов
/ 11 февраля 2011
SELECT vm.id,
    IF(vv.id IS NULL, NULL, vm1v.value) value1,
    IF(vv.id IS NULL, NULL, vm2v.value) value2,
    IF(vv.id IS NULL, NULL, vm3v.value) value3
FROM value_meta vm 
    LEFT JOIN value vmv1 ON vm.value1 = vmv1.id
    LEFT JOIN value vmv2 ON vm.value1 = vmv2.id
    LEFT JOIN value vmv3 ON vm.value1 = vmv3.id
    LEFT JOIN value_visibility vv ON vm.id = vv.id AND vv.value1_visibility = 1

Вам следует подумать о реструктуризации таблицы value_meta, есть ли причина, по которой вы храните значения 1, 2 и 3 в одной строке?

...