多表关联查询:无关联时返回NULL获取所有Inputs及其对应值
获取所有Inputs及其对应值(无关联时返回NULL)
要实现你需要的逻辑——获取所有inputs记录,同时返回对应的关联值(没有关联时返回NULL)——核心是使用LEFT JOIN(左连接),它会保留左表(这里是inputs)的所有行,即使右表没有匹配的记录。
假设表结构
先明确三张表的典型关联逻辑(如果你的字段名不同,直接对应替换即可):
inputs: 存储输入项定义,比如id(主键)、name(输入项名称,如name、job、city)posts: 存储帖子主体,比如id(主键)posts_values: 存储每个帖子的输入项值,比如post_id(关联posts.id)、input_id(关联inputs.id)、value(输入项的值)
针对单个帖子的查询
如果你需要查询某一个特定帖子的所有输入项及其对应值,使用下面的SQL:
SELECT i.name AS input, pv.value FROM inputs i LEFT JOIN posts_values pv ON i.id = pv.input_id -- 关联输入项和值表 AND pv.post_id = 1; -- 替换为你要查询的目标帖子ID
针对所有帖子的查询
如果需要获取所有帖子的每个输入项对应值,先通过CROSS JOIN生成所有帖子和输入项的组合,再左连接值表:
SELECT p.id AS post_id, i.name AS input, pv.value FROM posts p CROSS JOIN inputs i LEFT JOIN posts_values pv ON p.id = pv.post_id AND i.id = pv.input_id ORDER BY p.id, i.name;
逻辑解释
LEFT JOIN是核心:它会返回左表(inputs)的所有记录,当右表(posts_values)没有匹配的关联记录时,右表的字段(这里是value)会自动填充为NULL,完全符合你的需求。- 别用
INNER JOIN:它只会返回两边都有匹配的记录,会直接丢失那些没有对应值的输入项。
示例结果
假设你查询post_id=1的帖子,且该帖子只填写了name和job的值,没有city的记录,查询结果会是:
| input | value |
|---|---|
| name | David |
| job | Developer |
| city | NULL |
这和你给出的示例格式完全一致。
内容的提问来源于stack exchange,提问作者Muhammad Wardany
相关产品推荐
相关产品推荐

