我有两个表,一个是user
,另一个是images
。我为用户提供了选择多个图像的选项。我可以在数据库中存储多个具有相同user_id
的图像,但是当我尝试从每个用户获取一个图像时,我将获得所有图像。
我的查询是这样的:
$query = "
SELECT *
FROM images i
JOIN users u
ON u.user_id = i.user_id
LIMIT 1";
当我在while()
循环中运行此查询时,我只从images
表中获取第一张图像。
如果我无法澄清我想要问的内容,我真的很抱歉。
答案 0 :(得分:2)
你有没有试过这样的事情:
SELECT * FROM users u INNER JOIN images i ON u.user_id = i.user_id GROUP BY u.user_id;
对于每个拥有图像的用户,这应该只返回用户/图像表中的一条记录。
不要在while循环中运行查询。相反,使用一个查询来获取所有想要的记录。
如果您坚持在循环中运行查询,那么您在查询中缺少WHERE users.user_id = ?
部分,因此您可以在循环中为每个用户获得不同的结果。
答案 1 :(得分:1)
您可以在不使用加入的情况下执行此操作。简单的选择用户和获取数据,并在'id'的基础上添加查询以获取图像。我希望这能帮到您;
答案 2 :(得分:0)
您当前的查询: -
SELECT *
FROM images i
JOIN users u
ON u.user_id = i.user_id
LIMIT 1
使用LIMIT 1.这告诉查询返回1行。
删除LIMIT 1将为每个用户(至少拥有1个图像)返回1个或多个记录,每个图像一个。
如果你想要一个用户,那么(尽管不推荐)可以(ab)使用GROUP BY子句: -
SELECT *
FROM images i
JOIN users u
ON u.user_id = i.user_id
GROUP BY u.user_id
这会为每个用户带回一条记录,但是没有定义它返回的图像。它可以为该用户或最后一个或任何其他用户带回第一个图像(以及它返回的哪个图像将来可能会改变)。此外,没有实际的原因它不能为图像表中的每一列返回不同行的值(不太可能,但没有指定任何阻止这种情况发生)。
请注意,基本SQL标准指定(带有一个小例外),SELECT语句中带回的任何非聚合字段必须在GROUP BY子句中。 MySQL默认情况下不会强制执行此限制,但最近这个更改并默认强制执行。因此,默认情况下,此查询将不再起作用,因为它返回图像和用户表中的所有字段,同时仅在GROUP BY子句中指定users表中的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。然后将其连接到图像表以从图像表中获取该图像的其他详细信息。
注意我使用了LEFT OUTER JOIN。这是为没有上传任何图像的用户返回一行。
注意使用SELECT *通常是个坏主意,而不是指定要返回的列。我已将此留在此处,因为我不知道表格的列名。