Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多表的SQL选择查询_Mysql_Sql - Fatal编程技术网

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。谢谢你的提示,我仍然不擅长制作好的数据库表,我知道一些基本的东西,所以在制作一些表时,我会添加一些额外的复杂内容,根本不需要;)@在设计中,如果多对多是目的,那么它仍然是不正确的,因为每个类别在使用它的每个帖子上都会有多余的标题,所以我假设这就是目的。