2013-06-19 1 views
0

Хорошо, у меня есть таблица разрешений, в которой число столбцов может колебаться. На странице есть панель навигации, которая зависит от этой таблицы. Некоторые люди могут видеть некоторые модули, некоторые из них не могут, и т.д. То, что я хотел стянуть выбирают все столбцы, где значение не 0.MySQLВыберите все столбцы, где значение не равно 0

table modperm 
    uid 1234 
    module1 0 
    module2 2 
    module3 1 
    module4 0 
    module5 0 
    module6 1 
... 
... 
... 

Есть ли способ сделать что-то вроде

SELECT * FROM `modperm` WHERE `uid`='1234' AND value<>0 
+4

Это та точка, где вы обнаружите, что это действительно ужасно схема работать с и что ассоциация «один-ко-многим» Пользователь tween и разрешения сделали бы это очень легким. Вы нарушили правило [Zero, One или N] (http://en.wikipedia.org/wiki/Zero_one_infinity_rule). – tadman

+2

Читайте о нормализации базы данных. – hjpotter92

+0

Строго говоря, это возможно, присоединяясь к системным таблицам в базе данных information_schema. Но редизайн будет гораздо лучшей идеей. У вас есть таблица модулей и таблица людей, а затем таблица ссылок со строкой для каждой комбинации человек/модуль, которая допустима. – Kickstart

ответ

0

вы можете попробовать этот длинный запрос, но он может вам помочь.

select uid , group_concat(val) as vals from (
SELECT uid, module1 AS val 
FROM modperm 
WHERE module1 !=0 
and uid = 1234 

UNION ALL 
SELECT uid , module2 
FROM modperm 
WHERE module2 !=0 
and uid = 1234 

UNION ALL 
SELECT uid, module3 
FROM modperm 
WHERE module3 != 0 
and uid = 1234 

UNION ALL 
SELECT uid ,module4 
FROM modperm 
WHERE module4 !=0 
AND uid = 1234 

UNION ALL 
SELECT uid, module5 AS val 
FROM modperm 
WHERE module5 !=0 
and uid = 1234 

UNION ALL 
SELECT uid ,module6 
FROM modperm 
WHERE module6 !=0 
and uid =1234 
)t 

demo

если вы хотите показать имя модуля

выглядеть this demo

+0

То же, что и в другом ответе: проблема заключается в динамическом характере того, как стол был. Я перехожу к таблице стиля «один ко многим». Поддержание просто вышло из-под контроля. – TechHeadDJ

0
select * from modperm; 
    select uid, 
    case when module1 != 0 then 'valid' else 'invalid' end as module1 , 
    case when module2 != 0 then 'valid' else 'invalid' end as module2 , 
    case when module3 != 0 then 'valid' else 'invalid' end as module3 , 
    case when module4 != 0 then 'valid' else 'invalid' end as module4 , 
    case when module5 != 0 then 'valid' else 'invalid' end as module5 , 
    case when module6 != 0 then 'valid' else 'invalid' end as module6 
    ............. 
    from modperm where uid = 1234; 

Fiddle

+0

Проблема с этим - динамический характер того, как стол был. Я перехожу к таблице стиля «один ко многим». Поддержание просто вышло из-под контроля. – TechHeadDJ

Смежные вопросы