Php MySQL查询以检查行的单元格中的值并返回列名

Php MySQL查询以检查行的单元格中的值并返回列名,php,mysql,Php,Mysql,我一整天都在为某个问题苦苦挣扎,我决定寻求帮助 我需要一个查询来检查整个表行及其所有表单元格的值“yes”,然后它需要给我这是真的列的名称 举例说明: 在上表中,我需要检查水果行中所有值为“yes”的单元格,并将相应的列名返回给我。在这种情况下,结果将是“香蕉”、“苹果”和“梨” 我希望这个例子能有所帮助 -- pseudo code SELECT `COLUMN_NAMES` FROM `My_Table` ROW `fruit` WHERE `value` = 'yes'; 我还想指出,我

我一整天都在为某个问题苦苦挣扎,我决定寻求帮助

我需要一个查询来检查整个表行及其所有表单元格的值“yes”,然后它需要给我这是真的列的名称

举例说明: 在上表中,我需要检查水果行中所有值为“yes”的单元格,并将相应的列名返回给我。在这种情况下,结果将是“香蕉”、“苹果”和“梨”

我希望这个例子能有所帮助

-- pseudo code
SELECT `COLUMN_NAMES`
FROM `My_Table`
ROW `fruit`
WHERE `value` = 'yes';

我还想指出,我无法重新安排我的数据库。无法更改数据库结构,因为我们已经在执行诸如SELECT'property'这样的查询,其中'Banana'='yes'将返回'fruit'。我也需要它以另一种方式工作。

使用CONCAT\u WS将值为yes的所有列名连接起来。CONCAT_WS不包含NULL,因此为no列返回NULL将使它们不在结果中

SELECT CONCAT_WS(',', IF(Banana = 'yes', 'Banana', NULL),
                      IF(Apple = 'yes', 'Apple', NULL),
                      IF(Pear = 'yes', 'Pear', NULL),
                      ...) AS fruits
FROM yourTable
WHERE property = 'fruit';

我建议您尝试更改退货要求“香蕉、苹果、梨”。如果可以做到这一点,则可以按照以下模式将if语句硬编码到查询中:

select concat(
         if (`banana`='yes',  'banana,', ''), 
         if (`apple` ='yes',  'apple,',  ''), 
         if (`pear`  ='yes',  'pear,',   ''), 
         if (`beef`  ='yes',  'beef,',   ''), 
         if (`water` ='yes',  'water,',  '')
   ) as properties 
from table1
where ...

听起来你已经有了其他依赖于这个表结构的查询,但是不管怎样,我还是会认真考虑改变结构,即使它意味着重写一些查询。 我想Barmar写的查询会帮你得到你想要的。看起来应该是这样,从我所看到的情况来看,Barmar使用SQL没有什么是不可能的。但是考虑这个结构对你的其他应用程序的影响。

如果要添加项目,该怎么办?像别的水果什么的。通常,向数据库中添加项将通过插入查询完成。在这种情况下,您必须改用ALTERTABLE,并添加一列。完成此操作后,您还必须更改查询,该查询选择具有特定属性的项(您在此处询问的属性)以包括新列。您必须在任何时候添加项时更改应用程序代码,或者想出一些方法来动态地包含查询中的每一列

如果要选择具有多个属性的项目,该怎么办?很明显,液态水果并不多,除非你把它们放在冰箱里太久,但我认为这两种水果不是你将拥有的唯一属性。CONCAT方法将很难处理这个问题。我相信有办法解决这个问题,但实际上你只是在解决一个问题,而不是解决它

这只是几个例子,但还有许多其他问题将使这个结构成为一个真正的难题

处理这种多对多关系的一种不那么麻烦的方法是使用三个表。一个用于项目,一个用于属性,另一个用于将项目链接到其属性。像这样:

items                 properties          item_properties

id   item_name        id   name           item_id  property_id
1    banana           1    fruit          1        1
2    apple            2    liquid         2        1
3    pear                                 3        1
4    beef                                 5        2
5    water
然后可以选择项目的所有属性:

SELECT p.name
FROM properties p
INNER JOIN item_properties ip ON p.id = ip.property_id
INNER JOIN items i on ip.item_id = i.id
WHERE i.name = 'banana'
或具有特定属性的所有项目:

SELECT i.name
FROM items i
INNER JOIN item_properties ip ON i.id = ip.item_id
INNER JOIN properties p ON ip.property_id = p.id
WHERE p.name = 'fruit'

如果您现在不想更改现有的应用程序,我可以理解。但对于将来遇到这种情况的人,我真的建议从这样的结构开始。

带有值fruit和liquid的列的名称是什么?您的预期输出是什么?如果您需要执行这样的查询,那么您的表设计很差。您需要从查询返回的数据应该是单元格内容,而不是表或列名。这看起来像一个可怕的数据库结构。你应该研究数据库规范化。我想你可以称之为“属性”或类似的东西。预期输出是所有列名称,其中水果行中的单元格值为“是”。无法更改数据库结构,因为我们已经在执行诸如选择“属性”之类的查询,其中“香蕉”为“是”。我需要它来工作的另一种方式。谢谢你的答复巴尔马!我现在要睡觉了,明天再打给你!好看来我忘记给你回电话了。这个解决方案当时确实对我起了作用。与此同时,我学会了用关系结构来创建数据库,而不是像以前那样乱七八糟。再次感谢Barmar。您也感谢您的回复Xeo!我现在要睡觉了,明天再打给你!