我正在尝试使用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)
并运行查询,则该查询运行完美,所有行均正确显示。
发生了什么,我不是想了解它。查询在哪里出错,也没有显示错误。
答案 0 :(得分:2)
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
合并为一个字段:< / p>
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