2011-05-23 107 views
0

这里有两种说法我想在一个有两个选择语句帮助:我需要使用连接

SELECT pictures.picture, users.fname, users.lname, users.email, users.phone 
FROM users, pictures 
WHERE users.userid = 1 
AND pictures.userid = users.userid; 

SELECT pictures.picture, users.fname, users.lname, posts.post, 'post' AS 
type 
FROM users, posts, pictures 
WHERE users.userid = posts.userid 
AND posts.postid > 0 
AND users.userid =1 
AND pictures.userid = users.userid 
GROUP BY time 

以前我一直在使用UNION语句,但我可以”在这种情况下,由于两个语句中的列数不匹配,所以不要这样做。

在此先感谢。

+0

使用隐式连接是一个极其糟糕的做法。 PLease学习如何编写显式连接。 – HLGEM 2011-05-23 16:41:01

回答

1
SELECT p.picture, u.fname, u.lname, u.email, u.phone, p.post, 'post' AS type 
FROM users u 
LEFT JOIN posts p ON u.userid = p.userid 
LEFT JOIN pictures pic ON pic.user_id = u.userid 
WHERE u.userid = 1 
GROUP BY time 

如果您需要在结果集中的帖子或图片您可以更改LEFT JOININNER JOIN

+0

如果我想让电子邮件,电话号码,名字,第二个名字和图片出现在顶部,然后是底部的帖子,我该怎么办?这些帖子可能还包括名字和图片。 – user766346 2011-05-23 17:12:58

+0

你不会直接从RDBMS获得那种回应。您可以使用ORM来获得这种分组(父/子)或手动执行。为此,请按用户排序结果,然后仅在第一次看到该用户时才显示用户详细信息。 – Brad 2011-05-23 17:19:55

+0

非常感谢您的帮助,先生! – user766346 2011-05-23 17:45:53

1

如果您使列名称匹配,则可以使用UNION。例如:

SELECT pictures.picture, users.fname, users.lname, users.email, users.phone, NULL, NULL 
FROM users, pictures 
WHERE users.userid = 1 
AND pictures.userid = users.userid 
UNION ALL 
SELECT pictures.picture, users.fname, users.lname, NULL, NULL, posts.post, 'post' AS 
type 
FROM users, posts, pictures 
WHERE users.userid = posts.userid 
AND posts.postid > 0 
AND users.userid =1 
AND pictures.userid = users.userid 
GROUP BY time 
+0

尝试此操作时出现错误:#1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,在'UNION ALL SELECT pictures.picture,users.fname,users.lname,NULL,NULL,posts'附近使用正确的语法。在第1行 – user766346 2011-05-23 16:39:49

+0

我在'UNION'之前有一个流浪分号......纠正。 – dmc 2011-05-23 17:48:46

1
SELECT pictures.picture, users.fname, users.lname, posts.post, 
     'post' AS type, users.email, users.phone 
FROM users 
INNER JOIN pictures ON users.userid = pictures.userid 
INNER JOIN posts on users.userid = posts.userid 
WHERE users.userid = 1 
AND posts.postid > 0 
GROUP BY time; 
0

这可能是一个愚蠢的问题,我可能不是理解的东西,但为什么你需要两个陈述?

SELECT pictures.picture, users.fname, users.lname, 
FROM users, pictures 
WHERE users.userid = 1 
AND pictures.userid = users.userid; 

SELECT pictures.picture, users.fname, users.lname, posts.post, 
    'post' AS type, users.email, users.phone 
FROM users 
LEFT JOIN posts ON (posts.userid = users.userid AND posts.postid > 0) 
LEFT JOIN pictures (pictures.userid = users.userid) 
WHERE users.userid =1 
GROUP BY time 

希望有帮助。