我有两个表是 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。然后将其连接到图像表以从图像表获取该图像的其他详细信息。
注意我使用了左外连接。这是为没有任何图像上传的用户返回一行。
注意,使用选择 *通常是一个坏主意,而不是指定要返回的列。我不知道您的表的列名称。