mysql查询返回双行

时间:2015-06-13 09:17:03

标签: mysql

我正在使用标准的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     |
+------------------------+-----------------------+--------------+

有没有办法只显示一次文章,所有相应的类别名称都在一行中?

如果没有,我如何才能获得相关结果?我究竟做错了什么?感谢

2 个答案:

答案 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