Php 如何使用内部联接为每个用户获取1行

Php 如何使用内部联接为每个用户获取1行,php,mysql,inner-join,distinct,resultset,Php,Mysql,Inner Join,Distinct,Resultset,我有两个表,一个是user,另一个是images。我为用户提供了选择多个图像的选项。我可以在数据库中存储具有相同用户id的多个图像,但当我试图从每个用户获取一个图像时,我获取的是所有图像 我的问题是这样的: $query = " SELECT * FROM images i JOIN users u ON u.user_id = i.user_id LIMIT 1"; SELECT * FROM users u INNER JOIN images i ON u.user_

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

我的问题是这样的:

$query = "
SELECT * 
  FROM images i
  JOIN users u
    ON u.user_id = i.user_id 
 LIMIT 1";
SELECT * FROM users u INNER JOIN images i ON u.user_id = i.user_id GROUP BY u.user_id;
当我在
while()
循环中运行此查询时,我只从
images
表中获取第一幅图像


如果我不能澄清我想问的问题,我真的很抱歉。

您可以不使用join来完成此操作。简单地选择用户并获取数据,然后在“id”的基础上添加查询以获取图像。我希望这能帮助你

你试过这样的方法吗:

$query = "
SELECT * 
  FROM images i
  JOIN users u
    ON u.user_id = i.user_id 
 LIMIT 1";
SELECT * FROM users u INNER JOIN images i ON u.user_id = i.user_id GROUP BY u.user_id;
对于每个具有映像的用户,这应该只从用户/映像表返回一条记录

不要在while循环中运行查询。相反,使用一个查询来获取所有所需的记录

如果坚持在循环中运行查询,则查询中缺少
WHERE users.user\u id=?
部分,因此可以为循环中的每个用户获得不同的结果。

当前查询:-

SELECT * 
FROM images i
JOIN users u
ON u.user_id = i.user_id 
LIMIT 1
使用限制1。这告诉查询返回1行

删除限制1将为每个用户(至少有一个映像)返回一个或多个记录,每个映像一个记录

如果需要单个用户,则可以(尽管不推荐)使用GROUP BY子句:-

SELECT * 
FROM images i
JOIN users u
ON u.user_id = i.user_id 
GROUP BY u.user_id
这将为每个用户返回一条记录,但返回的图像尚未定义。它可以为该用户返回第一个图像,或者最后一个图像,或者任何其他图像(它返回的图像将来可能会更改)。此外,没有任何实际原因使它无法为images表中的每一列从不同的行返回值(不太可能,但没有指定阻止这种情况发生)

请注意,基本SQL标准规定(有一个小的例外),SELECT语句中返回的任何非聚合字段必须位于GROUPBY子句中。MySQL过去默认情况下不强制执行此限制,但最近这种情况发生了变化,默认情况下强制执行。因此,默认情况下,此查询将不再工作,因为它将从images和users表返回所有字段,同时仅从GROUP by子句中的users表指定user_id

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

这将使用子查询来获取每个用户的第一个图像id。然后将其加入到images表中,以从images表中获取该图像的其他详细信息

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


注意:使用SELECT*而不是指定要返回的列通常是一个坏主意。我把它留在这里,因为我不知道您的表的列名。

“在一个循环中”??是的,因为我想从数据库中获取所有用户,并想在索引页上显示所有用户。所以我想我确实需要while(mysqli\u fect\u数组($results))。我希望您能理解,不要在循环中运行查询。在循环中解析结果。在你的例子中,你只得到了结果中的一行,因为你只要求了一行。是的,我想我使用了word query而不是results,我的意思是查询或结果,而($row=mysqli_fetch($result))你救了我一命,多谢了,它工作起来很有魅力。如果您真的不介意解释这个“groupby”对这个查询做了什么,那么我对PHP有点陌生。我试图自己解决问题,但失败了。
groupby
在本例中是按
user\u id
对结果进行分组,并为每个
user\u id
返回一条记录。在不使用
分组方式的情况下尝试查询,看看会发生什么。@NaveenKumar这里没有“日保存”。上面的查询可以解决SQL中的任何问题。在新的MySQL安装中,默认情况下,这将失败。为每个用户返回的图像还没有定义。我猜您在谈论用户表中的特定id,但这里我想获取所有用户。如果您这样认为,那么请您写下一个查询。不,您可以从表中选择所有用户,然后在获取所有用户时,您将根据id对图像表进行另一个查询,您可以在此处设置限制1“选择*来自图像,其中用户id=$fr['id']”;其中$fr是获取结果;虽然这是完全可能的,但它的效率可能非常低。