无法在MySql中获得第三个表的唯一性和最大联接

时间:2019-07-16 05:09:12

标签: php mysql sql

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 

输出: enter image description here

我没有得到的第三个结果,即在加入时没有得到第三张表的distinctlatest record。 我想获得abc.jpeg而不是def.jpeg

1 个答案:

答案 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,然后将其重新连接到同一表中以从该行中获取其余数据)