多个表的SQL SELECT查询

时间:2012-02-15 15:46:49

标签: mysql sql

我有这些表格:

USERS:
user_ID
username
password
email
data_registered

POSTS:
post_ID
user_ID
post_title
post_content
post_data

CATEGORY:
cat_ID
post_ID
cat_title

现在我使用了这种情况:

在USERS表中我有:

(1, 'admin, '5hj63jhn120011', 'admin@gmail.com', '15.02.2012')
POSTS表中的

(1, 1, 'Hello', 'Content goes here', '15.02.2012')

在CATEGORY表中:

(1, 1, 'web developing'), 
(2, 1, 'software programming'), 
(3, 1, 'web design')

所以我只有1个用户,1个帖子和3个类别。如何在一个声明中选择它们?我用这句话:

SELECT 
  p.post_title, 
  p.post_content, 
  u.username, 
  c.cat_title 
FROM 
  posts p 
  LEFT JOIN users u 
     ON p.user_ID = u.user_ID 
  LEFT JOIN category c 
     ON c.post_ID = p.post_ID

但是这会选择3行,包含3个不同的类别。我还在学习如何正确地进行JOIN查询,所以我将不胜感激。

之后,例如,我将有情况从COMMENTS表中选择数据,因此这将变得复杂。只需提一下这是评论表:

COMMENTS:
comment_ID
user_ID
post_ID
c_username
c_email
c_content

用户,帖子和类别完全选择此评论会很困难。所以还有一个问题是我可以拆分这些选择查询吗?这是一个很好的做法(当用PHP开发时)?

4 个答案:

答案 0 :(得分:0)

尝试:

SELECT p.post_title, 
       p.post_content, 
       u.username, 
       group_concat(c.cat_title) categories
FROM posts p 
LEFT JOIN users u ON p.user_ID = u.user_ID 
LEFT JOIN category c ON c.post_ID = p.post_ID
group by p.post_id

- 如果您想查看同一行中单个帖子的所有类别。

答案 1 :(得分:0)

使用类似的东西:

SELECT 
  p.post_title, 
  p.post_content, 
  u.username, 
  GROUP_CONCAT(c.cat_title + ',') cat_titles
FROM posts p 
LEFT JOIN users u 
  ON p.user_ID = u.user_ID 
LEFT JOIN category c 
  ON c.post_ID = p.post_ID
GROUP BY 
  p.post_title, 
  p.post_content, 
  u.username

我不确定GROUP_CONCAT的正确用法,但看起来是否有效

答案 2 :(得分:0)

我认为应该是这样的:

POSTS:
post_ID
user_ID
cat_ID
post_title
post_content
post_data

CATEGORY:
cat_ID
cat_title

由于类别不需要与帖子相关,但每个帖子都需要与之相关的类别。

<强>更新

如果有多对多的意图那么它应该是这样的:

POSTS:
post_ID
user_ID
post_title
post_content
post_data

CATEGORY:
cat_ID
cat_title

POST_CATEGORY:
post_ID
cat_ID

答案 3 :(得分:0)

没有尝试过,我认为解决方案是:

SELECT p.post_title, p.post_content, u.username, c.cat_title 
FROM users u LEFT JOIN posts p ON u.user_ID = p.user_ID
LEFT JOIN category c ON p.post_ID = c.post_ID

如果更改ID列的顺序,则LEFT JOIN的含义会发生变化。所以你得到三个结果行......