表单php中的多对多关系选择复选框

表单php中的多对多关系选择复选框,php,mysql,Php,Mysql,我有3个表:带对象的表(A)、带属性的表(B)和带链接对象/属性的表(A.id、B.id)。问题是,当我需要编辑对象时,我需要将数据加载到表单中,包括复选框状态。我看到的一种可能的解决方案是从带有属性的表和带有对象的表中选择数据,然后使用嵌套循环写下复选框,其中主循环将生成复选框,子循环将查看选择数组,并选中id匹配上的复选框,但我认为必须有某种方法从表中选择数据 数据示例: A.id B.id C(A.id B.id) 1 1

我有3个表:带对象的表(A)、带属性的表(B)和带链接对象/属性的表(A.id、B.id)。问题是,当我需要编辑对象时,我需要将数据加载到表单中,包括复选框状态。我看到的一种可能的解决方案是从带有属性的表和带有对象的表中选择数据,然后使用嵌套循环写下复选框,其中主循环将生成复选框,子循环将查看选择数组,并选中id匹配上的复选框,但我认为必须有某种方法从表中选择数据

数据示例:

A.id          B.id        C(A.id B.id)
1             1             1    1
2             2             1    2
              3             1    3
              4             1    4
              5
我想得到的是:

B.id          A.id
1             1
2             1
3             1
4             1
5             NULL
因此,将检查索引为1、2、3、4的B项,并取消检查索引为5的B项。我是通过使用

SELECT DISTINCT B.id,  A.id FROM B LEFT JOIN C ON B.id=C.id 
WHERE A.id=<object id to edit> OR A.id IS NULL GROUP BY B.id
这意味着对于id为5的属性,仅显示一个未选中的复选框。 而不是像:

B.id          A.id
1             NULL
2             NULL
3             NULL
4             NULL
5             NULL

A.id=2。有什么方法可以实现这一点,或者我应该使用不同的逻辑?

您可以使用
CASE
而不使用
WHERE
子句

SELECT tableb.`id`,
(CASE WHEN tablec.`aid`=2 THEN tablec.`aid` ELSE NULL END ) AS test
 FROM tableb
LEFT JOIN tablec ON (tableb.`id` = tablec.`bid`) 


它将工作,并在所有条件下为您提供结果,无论您是否具有匹配的id

,您可以在连接条件中指定所需的A.id,而不是使用WHERE子句

SELECT DISTINCT B.id, C.a_id FROM B LEFT JOIN C ON B.id=C.b_id AND C.a_id=2 GROUP BY B.id

在这里尝试一下:

好吧,就像我想要的那样。非常感谢。我的逻辑是正确的,还是有更好的方法?你的逻辑是正确的,但是你的WHERE子句将获取数据,如果它没有根据id找到,但是对于id=1,它有数据,因此它不会给出你想要的结果,如果我的答案满足你,那么接受它谢谢
SELECT DISTINCT B.id, C.a_id FROM B LEFT JOIN C ON B.id=C.b_id AND C.a_id=2 GROUP BY B.id