如何使用INNER JOIN获得每个用户1行

时间:2017-04-26 07:09:10

标签: php mysql inner-join distinct resultset

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

我的查询是这样的:

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

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

如果我无法澄清我想要问的内容,我真的很抱歉。

3 个答案:

答案 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 *通常是个坏主意,而不是指定要返回的列。我已将此留在此处,因为我不知道表格的列名。