2016-04-11 3 views
0

У меня есть таблица базы данных настроить следующим образом:Выбор первого NOT NULL столбца, а затем получить имя этого столбца

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)), когда я его повторяю. Странно, да?

(info - mysql_field_name - Получить имя указанного поля в результате)

Для резюмировать: 3 линии РНР I, предоставляемой работает и предоставляет информацию из колонки, но мне нужен способ, чтобы получить ИМЯ этой колонки и храните его в строке. Благодаря


После выполнения метода Гордона я изменил первую строку моего 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, как это на самом деле не возвращаются что угодно), я проверил все имена столбцов являются правильными и т.д.

+0

См. [Почему я не должен использовать функции mysql_ * в PHP?] (Http://stackoverflow.com/q/12859942/214577). Этот код использует * очень * устаревшие функции, которые ** больше не являются частью PHP **. Вы можете захотеть (читайте: действительно, без каких-либо оправданий) отступите от них. – Oldskool

+0

Да, да, я знаю, не добрался до обновления –

ответ

1

Просто используйте 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 
    ) 
+1

, это возвращает логическое значение для меня, когда я пытаюсь запустить mysql_fetch_assoc по указанному выше запросу. Я немного изменил запрос: 'select (case, когда a не является нулевым, тогда 'a' , когда b не является нулевым, тогда 'b' ... конец) FROM directory WHERE id = '$ id' LIMIT 1' –

+0

@RyanButterworth. , , Это выражение 'case' должно возвращать строку. Я не вижу, как это может возвращать логическое значение. –

+0

Ну, это предполагает, что есть человеческая ошибка (ввод неправильных имен таблиц и т. Д.), Хотя я тщательно проверил –

1

Самым простым решением было бы с помощью array_filter (array_filter) Вы можете дать ему массив и без обратного вызова, это даст вам все элементы, которые оценивают true. Имя столбца остается таким, чтобы вы могли использовать ключевую функцию.
Так что-то вроде этого:

$keys = key(array_filter($cat)) 

А на $ клавиши [0] вы нашли свое имя.

+0

Проблема в том, что мой исходный запрос возвращает 'coalesce (a, b, c, d, e, f)' - поэтому, когда используя ваш метод '$ keys [0]' будет возвращать 'c' ....' $ keys [1] 'будет возвращать' o' .... '$ keys [2]' будет возвращать 'a' ... .. '$ keys [3]' будет возвращать 'l' и т. д. и т. д. и т. д. ... Я уверен, что ваш метод будет работать, но мой запрос неверен,' coalesce() 'не работает должным образом ... –

+0

Что если вы просто используете SQL-запрос без объединения и введите имя в php? Затем вы можете использовать этот метод. Или упоминание метода из @gordon. Но это имеет тот недостаток, что вы не так гибки. Например. при изменении схемы вам необходимо настроить свой запрос. – Shimu