Schemas
// First table
CREATE TABLE assignments (
id int,
uid int,
comments varchar(255),
assignmentdate date,
status int
);
INSERT INTO assignments (id, uid, comments, assignmentdate, status)
values (1, 6, 'a', '2019-07-15', 0), (2, 6, 'ab', '2019-07-15', 0),
(3, 6, 'abc', '2019-07-14', 0), (4, 6, 'abc', '2019-07-14', 1)
, (5, 7, 'xyz', '2019-07-14', 1), (6, 7, 'zyx', '2019-07-14', 1);
// Second table
CREATE TABLE users (
id int,
username varchar(255),
status int
);
INSERT INTO users (id, username, status)
values (6, 'user1', 0), (7, 'user2', 0),
(8, 'user3', 1);
// Third table
CREATE TABLE user_images (
id int,
uid int,
imagename varchar(255),
status int
);
INSERT INTO user_images (id, uid, imagename, status)
values (1, 6, 'abc.jpeg', 0), (2, 6, 'def.jpeg', 0), (3, 8, 'ghi.png', 1);
我在这里寻找的是得到 1)表格分配的最新行, 2)加入表用户并获得一行然后再加入, 3)表user_images的不同行和最新行。
到目前为止,我已经回答了这个问题
我的试用查询:
SELECT
p.*,
u.username,
groupedpi.*
FROM
assignments p
INNER JOIN(
SELECT
comments,
MAX(id) AS latest
FROM
assignments
WHERE
STATUS
= 0
GROUP BY
uid
) AS groupedp
ON
groupedp.latest = p.id
LEFT JOIN users u ON
p.uid = u.id AND u.status = 0
LEFT JOIN(
SELECT
uid,
MAX(id) AS latesti,
imagename
FROM
user_images us
WHERE
STATUS = 0
GROUP BY
uid
order by id desc LIMIT 1
) AS groupedpi
ON
groupedpi.uid = p.uid
我没有得到的第三个结果,即在加入时没有得到第三张表的distinct
和latest record
。
我想获得abc.jpeg
而不是def.jpeg
。
答案 0 :(得分:3)
MySQL在这里绊倒了您,因为如果未指定,它会自动将列添加到GROUP BY,因此它也会对imagename上的groupedpi子查询进行分组-这将导致重复的行。从子查询中删除imagename列(并且order by子句也无关紧要),并使其仅输出userid和最大图像ID
如果要使用图像名称,请在images.id = groupedpi.latesti
上再次加入图像表(在主查询中,而不是在查找最新图像ID的子查询中)
(请注意,您的屏幕截图显示为lastesti 2,但图像名称为abc,这不是正确的配对。ID2为def.jpg。当您需要最新ID以及同一行中的其他数据时,您将一击即破除非您使用分析(mysql8 +)-否则您必须编写一个子查询来找到最大id,然后将其重新连接到同一表中以从该行中获取其余数据)