我正在使用标准的apache2 LAMP配置(mysql和php5)以及UTF8编码。
我已经设置了四张桌子。
第一个名为articles
,有6列:
id INT(11) AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(1000),
posted (TIMESTAMP)
author_id INT(11),
extract TEXT,
body TEXT
第二个名为authors
id INT(11) AUTO INCREMENT PRIMARY KEY,
name VARCHAR(100),
img VARCHAR(100),
bio TEXT
第三个名为categories
id INT(2) AUTO_INCREMENT PRIMARY KEY,
cat_name VARCHAR(100)
第四个名为article_categories
id INT(2) AUTO_INCREMENT PRIMARY KEY,
article_id INT(11),
category_id INT(2)
现在我想要的是编写一个mysql查询,它将找到文章的标题,作者姓名和cat_name。到目前为止,我已经提出了这个问题,它返回了10行,基本上是我设置的所有类别。 (我已经设置了一个包含2个类别的文章,以及类别表中的5个类别。)
这是我的疑问:
SELECT articles.title, authors.name, categories.cat_name
FROM articles, authors, categories, article_categories
WHERE title LIKE '%introduction%';
和我的结果:
+------------------------+-----------------------+--------------+
| title | name | cat_name |
+------------------------+-----------------------+--------------+
| An introduction to ptc | Yannick Šušteršič | free |
| An introduction to ptc | Yannick Šušteršič | free |
| An introduction to ptc | Yannick Šušteršič | members-only |
| An introduction to ptc | Yannick Šušteršič | members-only |
| An introduction to ptc | Yannick Šušteršič | milestone |
| An introduction to ptc | Yannick Šušteršič | milestone |
| An introduction to ptc | Yannick Šušteršič | basic |
| An introduction to ptc | Yannick Šušteršič | basic |
| An introduction to ptc | Yannick Šušteršič | advanced |
| An introduction to ptc | Yannick Šušteršič | advanced |
+------------------------+-----------------------+--------------+
有没有办法只显示一次文章,所有相应的类别名称都在一行中?
如果没有,我如何才能获得相关结果?我究竟做错了什么?感谢
答案 0 :(得分:1)
您忘了比较作者和文章与类别:
SELECT
articles.title, authors.name, GROUP_CONCAT(categories.cat_name)
FROM
articles, authors, categories, article_categories
WHERE
title LIKE '%introduction%'
AND articles.author_id = authors.id
AND articles.id = article_categories.article_id
AND article_categories.category_id = categories.id;
更新后,这是由OP撰写的最终正确陈述。
答案 1 :(得分:1)
您正在执行所谓的times
操作(笛卡尔积)而非join
操作,以便结果将所有记录组合在一起,即使它们是不相关的。您的查询中缺少的是连接条件,以将结果限制为仅与实际相关的记录,即:
SELECT articles.title, authors.name, categories.cat_name
FROM articles, authors, categories, article_categories
WHERE title LIKE '%introduction%'
AND article_categories.article_id = articles.id
AND article_categories.category_id = categories.id
AND articles.author_id = authors.id