我正在尝试使用 3 个表显示数据
posts
- id
- category_id
- user_authors_id
- title
- status
user_authors
- id
- author_name
categories
- id
- name
subcategories
- id
- name
我想做的是。我正在创建一个将显示帖子的视图面板。所以,我使用了 3 张桌子。从user_authors我将获得作者姓名,从类别表中我将获得类别名称,现在类别表具有子类别 id,所以我也想获取子类别名称。
我在 posts
表中有两行 id 29 and 30
,但是当我运行以下查询时,它显示了 2 个具有相同数据的条目。
SELECT
posts.id,
categories.name AS cat_name,
subcategories.name AS subcat_name,
posts.title,
user_authors.author_name,
posts.created,
posts.status
FROM posts
INNER JOIN user_authors ON (user_authors.id = posts.user_author_id)
INNER JOIN categories ON(posts.category_id = categories.id)
INNER JOIN subcategories ON (categories.id = subcategories.category_id)
但是,如果我INNER JOIN subcategories ON (categories.id = subcategories.category_id)
删除此语句并运行查询,它将完美运行,所有行都正确显示。
发生了什么,我不是想得到它。查询在哪里错误,也没有显示错误。
INNER JOIN subcategories ON (categories.id = subcategories.category_id)
实际上,为了使您的查询返回您期望的内容,子类别中必须有一条且只有一条记录与给定post
匹配:
- 如果多个
subcategory
与给定post
匹配,则post
行将在结果中重复 - 如果没有
subcategory
与给定post
匹配,则post
不会出现在结果中
根据您的使用案例,您需要:
- 不
JOIN subcategory
,以避免重复post
-
LEFT JOIN subcategory
而不是INNER JOIN subcategory
以避免posts
,而不会过滤掉subcategory
如果给定帖子确实有多个子类别,并且仍希望在结果中显示一行,则可以使用 GROUP_CONCAT
聚合功能将subcategories
连接到一个字段中:
SELECT
posts.id,
categories.name AS cat_name,
GROUP_CONCAT( subcategories.name, ', ') AS subcat_names,
posts.title,
user_authors.author_name,
posts.created,
posts.status
FROM posts
INNER JOIN user_authors ON (user_authors.id = posts.user_author_id)
INNER JOIN categories ON(posts.category_id = categories.id)
LEFT JOIN subcategories ON (categories.id = subcategories.category_id)
GROUP BY
posts.id,
categories.name,
posts.title,
user_authors.author_name,
posts.created,
posts.status