У меня есть таблица базы данных, настроенная следующим образом:
table
--------
id: 123
name: test
description: lorem ipsum
a: NULL
b: NULL
c: NULL
d: lorem ipsum
e: NULL
f: lorem ipsum
Тогда у меня есть переменная на моей странице PHP, $id = 123
Как я могу вернуть название первого столбца NOT NULL, поиск в a, b, c, d, e, f
только? Так что в этом случае запрос вернет d
или же f
в строку. (НЕ lorem ipsum
)
Вот что я попробовал, чтобы вы лучше поняли, что мне нужно:
(насколько я знаю, COALESCE()
«вернет первый ненулевой аргумент»)
$cat = mysql_query("SELECT coalesce(a, b, c, d, e, f) FROM table WHERE `id`='$id' LIMIT 1");
$cat = mysql_fetch_assoc($cat);
$cat = array_shift(array_values($cat));
Вышеупомянутый запрос почти выполняет то, что я хочу, он возвращает информацию о первом столбце NOT NULL (поэтому в этом случае он возвращает lorem ipsum
) … что мне нужно это НАЗВАНИЕ этого столбца.
Итак, я попытался $cat = mysql_field_name($cat, 0);
(см. ниже информацию) — но, очевидно, это нужно выполнить в запросе, а не в строке, возвращаемой из mysql_fetch_assoc
, Поэтому я попытался сделать именно это и работает mysql_field_name
на запрос, и он возвращает часть исходного запроса (coalesce(a, b, c, d, e, f)
) когда я повторяю это. Странно, да?
(Информация —mysql_field_name
— получить имя указанного поля в результате)
Напомним: 3 строки PHP, которые я предоставил, работают и предоставляют информацию из столбца, но мне нужен способ получить НАЗВАНИЕ этого столбца и сохранить его в строку. Спасибо
Следуя методу Гордона, я изменил первую строку моего PHP в приведенном выше примере (запрос) на $cat = mysql_query("select (case when a is not null then 'a' when b is not null then 'b' when c is not null then 'c' when d is not null then 'd' when e is not null then 'e' when f is not null then 'f' end) FROM directory WHERE id='$id' LIMIT 1")
но он возвращает логическое значение (поэтому я не могу запустить mysql_fetch_assoc
поскольку он фактически ничего не возвращает), я проверил правильность всех имен столбцов и т. д.
Самое простое решение было бы с помощью array_filter (array_filter)
Вы можете дать ему массив и без обратного вызова, он даст вам все элементы, которые оцениваются как true. Имя столбца остается, так что вы можете использовать функцию ключа.
Так что-то вроде этого:
$keys = key(array_filter($cat))
И на $ keys [0] вы найдете свое имя.
Просто используйте case
:
select (
case
when a is not null then 'a'
when b is not null then 'b'
when c is not null then 'c'
when d is not null then 'd'
when e is not null then 'e'
when f is not null then 'f'
end
)