Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按顺序和限制为每组获取一行_Php_Mysql_Sql_Group By - Fatal编程技术网

Php 按顺序和限制为每组获取一行

Php 按顺序和限制为每组获取一行,php,mysql,sql,group-by,Php,Mysql,Sql,Group By,我的数据库中有用户上传的照片记录。他们可以指定其中一张上传的照片作为封面照片 我想查询我的数据库,为每个用户名返回一张照片。如果他们有封面照片,把那张还给他们。如果没有,请拉一张普通照片。指定封面照片的列是tinyint,长度为1。列为“0”(不是封面照片)或“1”(封面照片) 我要返回用户名列表中的所有照片 $usernames = array('bob', 'ted', 'jim'); $usernames = implode( "', '", $usernames ); $query =

我的数据库中有用户上传的照片记录。他们可以指定其中一张上传的照片作为封面照片

我想查询我的数据库,为每个用户名返回一张照片。如果他们有封面照片,把那张还给他们。如果没有,请拉一张普通照片。指定封面照片的列是tinyint,长度为1。列为“0”(不是封面照片)或“1”(封面照片)

我要返回用户名列表中的所有照片

$usernames = array('bob', 'ted', 'jim');
$usernames = implode( "', '", $usernames );

$query = "SELECT * FROM Photos WHERE username IN('$usernames')";
但我需要将它与以下内容结合起来,如果有封面照片,就会得到一张封面照片;如果没有一个用户名,就会得到一张普通照片

$query = "SELECT * FROM Photos WHERE username = 'bob' ORDER BY cover DESC LIMIT 1";
我想我需要使用功能组,但我不知道如何设置。有什么建议吗


如果每个用户只需要一张照片,则列为id(bigint)、name(varchar(255))、cover(tinyint)、username(varchar(30))

(如果有cover,则为cover;如果没有cover,则为normal)

如果你想要所有的普通照片,只有一张封面照片(如果有的话),你可以这样做

SELECT * FROM Photos WHERE cover = 1 AND username IN ('$usernames') GROUP BY username
UNION
SELECT * FROM Photos WHERE cover = 0 AND username IN ('$usernames')

如果每条记录都有一个唯一的标识符(
id
),则可以执行以下操作:

SELECT P1.* FROM Photos P1
WHERE P1.id IN (SELECT P2.id FROM Photos P2 
                WHERE P2.username =P1.username 
                ORDER BY P2.cover DESC LIMIT 1)
AND P1.username IN ('$usernames')
ORDER BY P1.username

在Mysql中,您需要执行以下操作:

select p.*
from Photos p left outer join
     (select username, min(photoid) as minphotoid
      from photos p
      where cover = 0
      group by username
     ) pmin
     on p.username = pmin.username and
        (p.cover = 1 or p.photoid = pmin.minphotoid)
where p.username in ('$usernames')
这实质上是在没有封面或封面的情况下查找一张照片(最少一张)。相关子查询在这方面有一些变化,可能会更快


顺便问一下,(“$usernames”)中的p.username在mysql中工作吗?在其他数据库中,这只适用于$usernames中的一个用户名。

假设您有一个用户表,并且photo表有一个id列

SELECT p.*
FROM Users u 
INNER JOIN Photo p ON p.id = (
    SELECT id FROM Photos p2 
    WHERE p2.username = u.username 
    ORDER BY cover DESC 
    LIMIT 1
)
WHERE u.username IN('$usernames');

您的底部查询不起作用?您的底部查询得到了什么结果集,因为它看起来应该可以正常工作。我得到了“bob”的正确照片,但我想以某种方式组合查询,因此我不执行两个查询,然后必须将结果与PHP匹配。我宁愿在一个查询栏中进行,尝试按用户名分组,然后按顺序排序,看看能给你什么。顺便说一句,下面的答案很接近,但我认为不会返回实际的照片。第一个查询只给出封面栏的最大值。它不按封面说明排序,每个用户名限制为1。它只是给了我用户名的第一张照片,不管它是否是封面?应该这样。做最大限度的工作就是按封面订购。因此,如果有3张照片,其中一张的封面设置为1,它将始终选择封面
SELECT p.*
FROM Users u 
INNER JOIN Photo p ON p.id = (
    SELECT id FROM Photos p2 
    WHERE p2.username = u.username 
    ORDER BY cover DESC 
    LIMIT 1
)
WHERE u.username IN('$usernames');