我在为MySQL编写查询时遇到了一些麻烦。我不知道如何很好地描述我的问题以便在网上搜索它,如果我的问题很愚蠢,那就很抱歉。
我有3张桌子:
CREATE TABLE posts( id INT, author INT );
CREATE TABLE users( id INT, nick varchar(64) );
CREATE TABLE groups( id INT, name varchar(64) );
CREATE TABLE membership (user INT, group INT, date INT ) ;
成员资格包含有关已加入某些群组的用户的信息。成员资格表中的“日期”是用户加入该组的时间。
我需要一个查询,它会返回一个帖子,作者的昵称以及加入日期最少的组名。
目前我只有:
SELECT p.id, u.nick, g.name
FROM posts AS p
LEFT JOIN users AS u ON u.id = p.author
LEFT JOIN membership AS m ON m.user = p.author
LEFT JOIN groups AS g ON g.id = m.group
WHERE 1;
但当然它会返回一个随机组的名称,而不是具有最早加入日期的名称。
我还尝试了以下变体:
SELECT p.id, u.nick, g.name
FROM posts AS p
LEFT JOIN users AS u ON u.id = p.author
LEFT JOIN
(SELECT * FROM membership WHERE 1 ORDER BY date ASC)
AS m ON m.user = p.author
LEFT JOIN groups AS g ON g.id = m.group
WHERE 1;
但它给了我相同的结果。
我甚至会感激指向我可以开始的地方,因为目前我不知道如何处理它。
答案 0 :(得分:0)
像这样的东西
SELECT p.id, u.nick, g.name
FROM posts p,
users u,
membership m,
groups g
WHERE p.author = u.id
AND m.user = u.id
AND m.group = g.id
ORDER BY m.date ASC
LIMIT 1;
加入这4个表时要注意保持良好的索引。
答案 1 :(得分:0)
我不知道你为什么要这么做,但是,如果你想要最早成员资格日期的信息(因为没有发布日期的日期),没问题。现在,我们有最早的会员资格,总是指向同一个人,因为你没有要求特定的团体..(或者你是否想要最早的人PER会员群 - 这就是我要写的查询)。现在,我们有最早的用户,可以链接到帖子表(显然是作者),但如果有人在他们的名字下有20个帖子怎么办...你是否也想要该作者的第一个ID。
只需从提供的表中复制作为参考... posts:id(int),author(int) 用户:id(int),nick(varchar) groups:id(int),name(varchar) 成员资格:user(int),group(int),date(int)
select
u1.nick,
m2.date,
g1.name,
p1.id as PostID
from
( select m.group,
min( m.date ) as EarliestMembershipSignup
from
Membership m
group by
m.group ) EarliestPerGroup
join Membership m2
on EarliestPerGroup.Group = m2.Group
AND EarliestPerGroup.EarliestMembershipSignup = m2.Date
join groups g1
on m2.group = g1.id
join users u1
on m2.user = u1.ID
join posts p1
on u1.id = p1.author
答案 2 :(得分:0)
我建议您将会员列表中的日期列移动到您的群组表中,因为这似乎是您跟踪该信息的位置。成员资格表只是多对多用户< - >组表的交集表。它应该只包含用户ID和组ID列。
这个怎么样?
SELECT p.id, u.nick, g.name
FROM
users u,
posts p,
groups g
INNER JOIN membership m
ON u.id = m.user
INNER JOIN groups
ON m.group = groups.id
ORDER BY g.timestamp DESC
LIMIT 1;