Php MySQL查询,用于显示一个表的所有行,如果匹配其他表,则显示“是/否”?

Php MySQL查询,用于显示一个表的所有行,如果匹配其他表,则显示“是/否”?,php,mysql,join,Php,Mysql,Join,我为这个问题的非技术性描述提前道歉 我有两张表:UsersOptions和OptionsList 为简单起见,选项列表如下: ID-名称 1-红色 2-蓝色 3-橙色 UsersOptions有许多行,例如 ID-客户端-选项 1-约翰-瑞德 2-约翰-奥兰治 3-玛丽-瑞德 4-吉尔蓝 5-吉尔-橙色 等 我是否可以运行一个查询来提供以下输出?是/否不是必需的 John的输出: 选项-是/否 红色-y 蓝色-n 橙色-y 玛丽的作品: 选项-是/否 红色-y 蓝色-n 橙色-n 这快把我逼疯

我为这个问题的非技术性描述提前道歉

我有两张表:UsersOptions和OptionsList

为简单起见,选项列表如下:

ID-名称 1-红色 2-蓝色 3-橙色 UsersOptions有许多行,例如

ID-客户端-选项 1-约翰-瑞德 2-约翰-奥兰治 3-玛丽-瑞德 4-吉尔蓝 5-吉尔-橙色 等 我是否可以运行一个查询来提供以下输出?是/否不是必需的 John的输出:

选项-是/否 红色-y 蓝色-n 橙色-y 玛丽的作品:

选项-是/否 红色-y 蓝色-n 橙色-n 这快把我逼疯了! 感谢所有能帮忙的人

您可以将语句与子查询一起使用:

SELECT
  NAME,
  CASE WHEN EXISTS 
       (SELECT ID FROM UsersOptions 
        WHERE CLIENT = 'John' AND `OPTION` = OptionsList.NAME)
       THEN 'y' ELSE 'n' END AS `YES/NO`
FROM
  OptionsList
可以将语句与子查询一起使用:

SELECT
  NAME,
  CASE WHEN EXISTS 
       (SELECT ID FROM UsersOptions 
        WHERE CLIENT = 'John' AND `OPTION` = OptionsList.NAME)
       THEN 'y' ELSE 'n' END AS `YES/NO`
FROM
  OptionsList

这将适用于John,根据您的需要调整或删除WHERE子句

    SELECT t2.name AS name,
           IF(t1.option IS NULL, 'y', 'n') AS value
      FROM UserOptions AS t1
RIGHT JOIN OptionsList AS t2 ON (t1.option = t2.name)
     WHERE t1.client = 'John'

虽然我不明白为什么不规范UserOptions表中的option字段。您使用的是name值而不是id,原因是什么?

这将适用于John,根据您的需要调整或删除WHERE子句

    SELECT t2.name AS name,
           IF(t1.option IS NULL, 'y', 'n') AS value
      FROM UserOptions AS t1
RIGHT JOIN OptionsList AS t2 ON (t1.option = t2.name)
     WHERE t1.client = 'John'

虽然我不明白为什么不规范UserOptions表中的option字段。你用name值而不是ID,因为什么原因?

考虑使用opsiSList.id作为USER选项表的外键,而不是重复字符串红色,这可能是个好主意。橙色和蓝色。考虑使用OpthSlist.ID作为外键来代替UpRealStable表是一个好主意,而不是重复红色、橙色和蓝色的字符串。这个IMHO将比Phil的回答更好。刚才我试过了,但是它只返回了YES匹配的单行。对于不存在的行,是否应该返回NO?谢谢正如山姆所说,这不太管用。UsersOptions上的WHERE约束有效地将左外部联接转换为内部联接。这意味着不会返回用户没有的选项。要解决此问题,请删除WHERE约束,并将join约束更改为ON o.NAME=u.OPTION和u.CLIENT='John'。此imho将比Phil的回答性能更好。我刚才尝试了此操作,但它只返回一行YES匹配项。。对于不存在的行,是否应该返回NO?谢谢正如山姆所说,这不太管用。UsersOptions上的WHERE约束有效地将左外部联接转换为内部联接。这意味着不会返回用户没有的选项。若要解决此问题,请删除WHERE约束,并将连接约束更改为ON o.NAME=u.OPTION和u.CLIENT='John'。好的,在顶部查询中需要对客户端进行一些调整:SELECT OptionsList.NAME,案例存在时,从UserOptions中选择ID,其中UserOptions.OPTION=OptionsList.NAME和UserOptions.CLIENT='John',然后选择'y'ELSE'n'作为是/否从Options List中结束非常感谢!我以前从来没有听说过这个案子@Sam我已经编辑了我的回复,以移动客户端约束我昨天晚上显然没有醒!。好的,这对需要进入顶部查询的客户端进行了一些调整:SELECT OptionsList.NAME,CASE WHEN EXISTS从UserOptions中选择ID WHERE UserOptions.OPTION=OptionsList.NAME和UserOptions.CLIENT='John'然后'y'ELSE'n'结束为OptionsList中的YES/NO非常感谢!我以前从来没有听说过这个案子@Sam我已经编辑了我的回复,以移动客户端约束我昨天晚上显然没有醒!。这不管用。它将返回两行“Red”、“n”和“Orange”、“n”。要使其正常工作,请删除WHERE约束,将连接约束更改为ON t1.option=t2.name和t1.client='John',并在IF函数中交换'y'和'n'的顺序。这不起作用。它将返回两行“Red”、“n”和“Orange”、“n”。要使其正常工作,请删除WHERE约束,将连接约束更改为ON t1.option=t2.name和t1.client='John',并在IF函数中交换'y'和'n'的顺序。