Mysql 多表的SQL选择查询
我有这些桌子:Mysql 多表的SQL选择查询,mysql,sql,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 现在我使用了这种情况: 在用户表中,我有: (1, 'admin, '5hj63jhn120011', 'admin@gmail.com', '15.02.2012') 在员额表中:
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
现在我使用了这种情况:
在用户表中,我有:
(1, 'admin, '5hj63jhn120011', 'admin@gmail.com', '15.02.2012')
在员额表中:
(1, 1, 'Hello', 'Content goes here', '15.02.2012')
在类别表中:
(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个不同的类别。我仍在学习如何正确地进行此连接查询,因此我将感谢您的帮助
然后,例如,我还要从COMMENTS表中选择数据,所以这会很复杂。请注意,这是注释表:
COMMENTS:
comment_ID
user_ID
post_ID
c_username
c_email
c_content
这将是很难选择这个评论与用户,帖子和类别一起。所以,还有一个问题是,我可以拆分这个select查询吗?这通常是一个好的实践吗(在使用PHP开发时) 试试看:
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
-如果您想在同一行中查看一篇文章的所有类别。请使用以下内容:
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的正确用法,但看起来是否有效我认为应该是这样的:
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
如果没有尝试过,我认为解决方案是:
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列的顺序,左联接的含义将更改。因此,您会得到三个结果行……您能提供所需的示例结果集吗?这与您的问题无关,但您确定一个类别只对应一篇文章吗?@C.champing您是说一篇文章-一个类别?@BojanSavic我是说n篇文章-n个类别。我认为一个类别不应该局限于一个帖子。例如,应该有几个与mysql相关的帖子。在StackOverflow中,我能做的最好的比较是标签(=类别)与问题(帖子)的关联。嗯,如果数据相同,结果会是相同的。这将是一种不同的关系——在原始问题中,一篇帖子可能同时属于多个类别,但在这个答案中,一篇文章只能属于一个类别,所以一篇文章只能有一个类别。更好的设计可能是Posts、post-Category、Category。谢谢你的提示,我仍然不擅长制作好的数据库表,我知道一些基本的东西,所以在制作一些表时,我会添加一些额外的复杂内容,根本不需要;)@在设计中,如果多对多是目的,那么它仍然是不正确的,因为每个类别在使用它的每个帖子上都会有多余的标题,所以我假设这就是目的。