Php 首先选择NOTNULL列,然后获取该列的名称

Php 首先选择NOTNULL列,然后获取该列的名称,php,mysql,sql,coalesce,Php,Mysql,Sql,Coalesce,我通过以下方式设置了一个数据库表: 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 如何返回第一个非空列的名称,仅在中搜索a、b、c、d、e、f?因此在本例中,查询将d或f返回到字符串中。(非lorem ipsum) 以下是我为让您更好地了解我的需求而做的

我通过以下方式设置了一个数据库表:

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

如何返回第一个非空列的名称,仅在
中搜索a、b、c、d、e、f
?因此在本例中,查询将
d
f
返回到字符串中。(
lorem ipsum

以下是我为让您更好地了解我的需求而做的一些尝试:

(据我所知,
COALESCE()
将“返回第一个非空参数”)

上面的查询几乎满足了我的要求,它返回第一个NOTNULL列的信息(因此在本例中,它返回
lorem ipsum
)。。。我需要的是该列的名称

于是我尝试了
$cat=mysql\u field\u name($cat,0)
(请参见下面的信息)-但显然这需要在查询上运行,而不是从
mysql\u fetch\u assoc
返回的字符串。所以我试着完全这样做,在查询上运行
mysql\u field\u name
,当我回显它时,它返回原始查询的一部分(
coalesce(a,b,c,d,e,f)
)。奇怪吧

mysql\u field\u name
-获取结果中指定字段的名称)

重述一下:我提供的3行PHP正在工作并从一个列中提供信息,但我需要一种方法来获取该列的名称,并将其存储到一个字符串中。谢谢



遵循Gordon的方法后,我将上面示例中PHP的第一行(查询)更改为
$cat=mysql\u查询(“选择(a不为null时的情况,b不为null时的“a”,b不为null时的“b”,c不为null时的“c”,d不为null时的“d”,e不为null时的“e”,f不为null时的“f”结束)从id='$id'LIMIT 1“
目录返回一个布尔值(因此我无法运行
mysql\u fetch\u assoc,因为它实际上没有返回任何内容),我已经检查了所有列的名称是否正确等。

只需使用
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
      )

只需使用
案例

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
      )

最简单的解决方案是借助数组_过滤器() 您可以给它一个数组,而不需要回调,它将给您所有计算为true的元素。保留列名,以便您可以使用键功能。
比如说:

$keys = key(array_filter($cat))

在$keys[0]上可以找到您的名字。

最简单的解决方案是借助数组过滤器() 您可以给它一个数组,而不需要回调,它将给您所有计算为true的元素。保留列名,以便您可以使用键功能。
比如说:

$keys = key(array_filter($cat))

在$keys[0]上可以找到您的名字。

当我尝试对上述查询运行
mysql\u fetch\u assoc
时,这为我返回了一个布尔值。我稍微更改了查询,
从id='$id'LIMIT 1
@RyanButterworth…的目录中选择(a不为null的情况下选择'a',b不为null的情况下选择'b'…结束)。此
大小写
表达式应返回字符串。我不知道它怎么会返回布尔值。虽然我仔细检查了一下,但这表明存在人为错误(键入表名错误等),当我尝试在上面的查询上运行
mysql\u fetch\u assoc
时,这会为我返回布尔值。我稍微更改了查询,
从id='$id'LIMIT 1
@RyanButterworth…的目录中选择(a不为null的情况下选择'a',b不为null的情况下选择'b'…结束)。此
大小写
表达式应返回字符串。我不知道它怎么会返回布尔值。虽然我彻底检查了问题,但这可能表明存在人为错误(键入表名错误等)。问题是,我的原始查询返回的是
coalesce(a,b,c,d,e,f)
-因此当使用您的方法时,
$keys[0]
将返回
c
$keys[1]
将返回
o
$keys[2]
将返回
a
$keys[3]
将返回
l
等。。。我很确定您的方法可以工作,但我的查询是错误的,
coalesce()
工作不正常……如果您只使用sql查询而不使用coalesce并在php中获取名称会怎么样?然后你可以用这个方法。或者@gordon提到的方法。但这样做的缺点是你不够灵活。例如,当模式发生变化时,您需要调整查询。问题是,我的原始查询返回的是
coalesce(a、b、c、d、E、f)
-因此,当使用您的方法时,
$keys[0]
将返回
c
$keys[1]
将返回
o
$keys[2]
将返回
a
$keys[3]
将返回
l
等。。。我很确定您的方法可以工作,但我的查询是错误的,
coalesce()
工作不正常……如果您只使用sql查询而不使用coalesce并在php中获取名称会怎么样?然后你可以用这个方法。或者@gordon提到的方法。但这样做的缺点是你不够灵活。例如,当架构更改时,您需要调整查询。请参阅。这段代码使用了非常过时的函数,这些函数不再是PHP的一部分。你可能想(读:真的应该,没有任何借口)远离他们。是的,是的,我知道,没有时间更新Yet,请看。这段代码使用了非常过时的函数,这些函数不再是PHP的一部分。你可能想(读:真的应该,没有任何借口)远离他们。是的,我知道,还没来得及更新