如何使用内在加入如何获得每个用户1行



我有两个表是 user,另一个是 images。我给用户选择了选择多个图像。我可以在数据库中存储多个具有相同user_id的图像,但是当我尝试从每个用户那里获取一个图像时,我将获得所有图像。

我的查询就是这样:

$query = "
SELECT * 
  FROM images i
  JOIN users u
    ON u.user_id = i.user_id 
 LIMIT 1";

当我在while()循环中运行此查询时,我只从images表中获取第一个图像。

我真的很抱歉,如果我无法澄清我要问什么。

您是否尝试过这样的事情:

SELECT * FROM users u INNER JOIN images i ON u.user_id = i.user_id GROUP BY u.user_id;

这应该为每个具有图像的用户从用户/图像表中返回一个记录。

不要在一段时间内运行查询。而是使用一个查询获取所有所需的记录。

如果您坚持在循环中运行查询,则您在查询中缺少WHERE users.user_id = ?零件,因此您可以在循环中为每个用户获得不同的结果。

您无需使用加入即可执行此操作。简单选择用户和获取数据,以及在" ID"的底部添加查询以获取图像。我希望这能帮到您;

您的当前查询: -

SELECT * 
FROM images i
JOIN users u
ON u.user_id = i.user_id 
LIMIT 1

使用限制1.这告诉查询要带回1行。

删除限制1将返回每个用户(至少有1张图像(,每个图像的记录1或更多记录。

如果您想要一个用户,则可能(尽管不建议使用((AB(使用该组的子句: -

SELECT * 
FROM images i
JOIN users u
ON u.user_id = i.user_id 
GROUP BY u.user_id

这将带回每个用户的一个记录,但是它返回的哪个图像未定义。它可以带回该用户,最后一个或其他任何一个图像(以及将来返回的图像(。此外,没有实际原因无法从图像表上的每个列返回不同行的值(不太可能,但没有指定任何可以阻止这种情况的情况(。

请注意,基本的SQL标准指定(有一个小例外(,任何非聚合字段都必须在SELECT语句中带回该组中的任何非聚合字段。MySQL过去默认情况下不执行此限制,但最近发生了变化,默认情况下会执行。因此,默认情况下,此查询将不再起作用,因为它正在从图像和用户表中返回所有字段,而仅从子句中的用户表指定USER_ID。

您应该做的是定义每个用户想要的图像。假设第一个图像(并且图像表使用自动增量主键称为ID(: -

SELECT u.*,
        i.*
FROM users u
LEFT OUTER JOIN
(
    SELECT user_id
            MIN(id) AS first_image_id 
    FROM images
    GROUP BY user_id
) sub0
ON u.user_id = sub0.user_id
LEFT OUTER JOIN images i
ON sub0.user_id = i.user_id AND sub0.first_image_id = i.id

这使用子查询来获取每个用户的第一个图像ID。然后将其连接到图像表以从图像表获取该图像的其他详细信息。

注意我使用了左外连接。这是为没有任何图像上传的用户返回一行。

注意,使用选择 *通常是一个坏主意,而不是指定要返回的列。我不知道您的表的列名称。

相关内容

  • 没有找到相关文章

最新更新