MySQL:加入三个表

时间:2014-02-01 00:53:49

标签: php mysql sql database join

我是新手,请原谅基本问题。我只是很难概念化它是如何工作的。

假设我的数据库中有三个包含这些相关列的表:

POSTS - post_id, post_title, post_date
CATEGORIES - post_id, cat_id
CATEGORY NAMES - cat_id, cat_name

现在,我正在尝试显示按post_date排序的所有帖子的列表。在此列表中,我想列出该类别。

我已经达到了这个目标:

SELECT * 
FROM posts
LEFT JOIN categories ON posts.post_id = categories.post_id
ORDER BY post_date ASC

这种作品有两个问题:

  1. 由于帖子可以有多个类别(即categories每个post_id中有多个条目),我会收到重复的内容。我想摆脱重复,但承认帖子是否属于多个类别。
  2. 除了做另一个查询之外,我不知道如何更进一步获取cat_name。这看起来有点浪费。有没有办法在一个查询中执行此操作?
  3. 再次,抱歉这个的基本性质。我已经读了很长时间的教程,但我似乎无法解决这个问题。任何方向都表示赞赏。

2 个答案:

答案 0 :(得分:0)

每个帖子一排,是吗?我们如何为您提供逗号分隔的类别名称?

     SELECT p.post_title, p.post_date, 
            GROUP_CONCAT(c.cat_name SEPARATOR ', ') AS categories
       FROM posts AS p
  LEFT JOIN categories AS pc ON p.post_id = pc.post_id
  LEFT JOIN category_names AS c ON pc.cat_id = c.cat_id 
   GROUP BY p.post_title, p.post_date
   ORDER BY p.post_date ASC, p.post_title

两个连续的连接选择类别名称,GROUP_CONCAT将多个类别名称聚合到逗号分隔的列表中。要GROUP_CONCAT开展工作,我们还需要GROUP BY

答案 1 :(得分:0)

使用以下格式:

SELECT t1.name
              ,t1.age
              ,GROUP_CONCAT(t2.job_name SEPARATOR',')typeofjob
        FROM t_one AS t1
        JOIN t_three AS t3 ON t3.user_id = t1.user_id
        JOIN t_two AS t2 ON t2.job_id = t3.job_id
        GROUP BY t1.user_id;

输出:

output is following